使用ravenDb或mssql作为事件存储

时间:2014-06-11 13:05:50

标签: c# domain-driven-design ravendb cqrs

我阅读了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事件存储?

1 个答案:

答案 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();
        }
    }
}