RavenDB IRavenQueryable理解类型(事件采购)

时间:2014-11-13 12:08:06

标签: ravendb iqueryable event-sourcing

我目前正在与专门用于事件采购的RavenDB一起构建存储库。 (存储事件)。

我编写的代码允许我根据类型提取事件。

它正在工作,但它并不是一个很好的实现,因为我使用IEnumerable而不是IQueryable。我很难将其实现为IRavenQueryable,因为不允许进行类型检查。

我的问题纯粹是,有没有更好的方法来实现这个目标?

以下是我的代码。

我有一个所有Event对象都遵循的接口。

public interface IEvent
    {
        string Id { get; set; }
        Guid AggregateRootId { get; set; }
        int Version { get; set; }
        DateTime DateCreated { get; set; }

    }

接下来我有我的事件类(这些只是测试类): -

public class BookDecriptionChangedEvent : IEvent
    {
        public string Id { get; set; }
        public Guid AggregateRootId { get; set; }
        public string Description { get; set; }
        public int Version { get; set; }
        public DateTime DateCreated { get; set; }
    }

 public class BookTitleChangedEvent : IEvent
    {
        public string Id { get; set; }
        public Guid AggregateRootId { get; set; }
        public string Name { get; set; }
        public int Version { get; set; }
        public DateTime DateCreated { get; set; }
    }

对于我的存储库,我想创建一个允许我通过AggregateRoodId获取所有事件的方法。但我希望能够传递许多不同类型的事件: -

// Get All Events for this Aggregate.
_repository.GetByAggreageRootId<IEvent>("b876baea-f2c2-49e1-9abc-683e031cf6d4");

// Get All Events of Type BookDecriptionChangedEvent for this Aggregate.
_repository.GetByAggreageRootId<BookDecriptionChangedEvent>("b876baea-f2c2-49e1-9abc-683e031cf6d4");

// Get All Events of Type BookTitleChangedEvent for this Aggregate.
_repository.GetByAggreageRootId<BookTitleChangedEvent>("b876baea-f2c2-49e1-9abc-683e031cf6d4");

目前,我已通过编写以下存储库代码来实现此目的: -

 public interface IRepository
    {
        IEnumerable<IEvent> GetByAggreageRootId<TEvent>(string id) where TEvent : IEvent;
    }

在实施中我有这个方法: -

public IEnumerable<IEvent> GetByAggreageRootId<TEvent>(string id) where TEvent : IEvent
        {
            if (Session == null)
            {
                throw new ArgumentException("Document Session");
            }

            using (Session)
            {
                if (typeof(TEvent) == typeof(IEvent))
                {
                    return GetAll<IEvent>().Where(p => p.AggregateRootId == new Guid(id));
                }

                return GetAll<IEvent>().ToList().Where(p => p.GetType() == typeof (TEvent) && p.AggregateRootId == new Guid(id));
            }

}

0 个答案:

没有答案