используя ravenDb или mssql в качестве хранилища событий

1

Я прочитал Введение в статью 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
    Вы можете использовать NEventStore напрямую. Он поддерживает много БД и имеет репо в памяти.
Теги:
domain-driven-design
ravendb
cqrs

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню