我阅读了Introduction to CQRS文章,我发现它非常有用。
本文后面的项目代码使用InMemoryEventStorage
来演示EventStore
以及添加和检索事件。
我知道这仅用于演示目的,但我想在此示例中看到如何使用ravenDb或mssql数据库构建更高效的解决方案。
此InMemoryEventStorage
实现
public interface IEventStorage
{
IEnumerable<Event> GetEvents(Guid aggregateId);
void Save(AggregateRoot aggregate);
T GetMemento<T>(Guid aggregateId) where T : BaseMemento;
void SaveMemento(BaseMemento memento);
}
再一次,您如何根据上面链接中给出的示例构建ravenDb或mssql db事件存储?
答案 0 :(得分:1)
您可以正常方式使用RavenDB - 只需通过会话加载和保存项目:
public class RavenEventStorage : IEventStorage
{
private IDocumentStore store;
public RavenEventStorage(IDocumentStore store)
{
this.store = store;
}
public IEnumerable<Event> GetEvents(Guid aggregateId)
{
using(var session = store.OpenSession())
{
BaseMemento memento = session.Load<BaseMemento>(aggregateId);
// Its null if it doesn't exist - so return an empty array
if(memento==null)
return new Event[0];
return memento.Events.AsEnumerable();
}
}
public void Save(AggregateRoot aggregate)
{
using(var session = store.OpenSession())
{
session.Store(aggregate);
session.SaveChanges();
}
}
public T GetMemento<T>(Guid aggregateId) where T : BaseMemento
{
using(var session = store.OpenSession())
{
return session.Load<T>(aggregateId);
}
}
public void SaveMemento(BaseMemento memento)
{
using(var session = store.OpenSession())
{
session.Store(memento);
session.SaveChanges();
}
}
}