我目前正在与专门用于事件采购的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));
}
}