Я прочитал Введение в статью 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 на основе приведенного выше примера по ссылке?
Вы можете использовать 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();
}
}
}