Ncqrs: Как создать событие, не имея совокупного корня - PullRequest
3 голосов
/ 19 октября 2011

Учитывая, что у меня есть два ограниченных контекста :

  1. Fleet Mgt - простой поддерживающий поддомен на основе CRUD
  2. Sales - это мой CQRS-ориентированный Основной домен

Когда в управлении парком происходит операция CRUD, должно быть опубликовано событие, отражающее операцию:

  • AircraftCreated
  • AircraftUpdated
  • AircraftDeleted
  • и т. Д.

Эти события необходимы: а) для обновления различных таблиц индекса, необходимых в домене продаж, иединый журнал аудита.

Вопрос: Существует ли простой способ хранить и публиковать эти события (для InProcessEventBus, здесь я не использую NSB) без прохождения AggregateRoot, что мне не нужно в простом контексте CRUD.

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

Если вы хотите опубликовать событие о чем-то, это что-то, вероятно, является агрегированным корнем, потому что это внешне идентифицированный объект, представляющий интерес, в противном случае зачем вам их отслеживать?

Помня об этом, вам не нужны индексные таблицы (я так понимаю, для запросов) в BC BC. Вам нужны GUID самолета, и только поиск / соединение на стороне чтения.

Для аудита я бы просто добавил общее событие аудита через отражение в репозиториях / единицах работы.

0 голосов
/ 19 октября 2011

По словам Питера, основного участника Ncqrs, сделать это невозможно из коробки.

В этом сценарии я не хочу проходить всю церемонию создания и выполнения команды, а затем загружать агрегатный корень из хранилища событий, просто чтобы он отправил событие.

Поведение - это простой CRUD, реализованный с использованием простейшего возможного решения, которое в данном конкретном случае представляет собой формы поверх данных с использованием Entity Framework. Единственное, что мне нужно, - это публикация события после совершения транзакции.

Мое решение выглядит так:

// Abstract base class that provides a Unit Of Work

public abstract class EventPublisherMappedByConvention 
    : AggregateRootMappedByConvention
{
    public void Raise(ISourcedEvent e)
    {
        var context = NcqrsEnvironment.Get<IUnitOfWorkFactory>()
            .CreateUnitOfWork(e.EventIdentifier);
        ApplyEvent(e);
        context.Accept();
    }
}

// Concrete implementation for my specific domain
// Note: The events only reflect the CRUD that's happened.
// The methods themselves can stay empty, state has been persisted through
// other means anyway.

public class FleetManagementEventSource : EventPublisherMappedByConvention
{
    protected void OnAircraftTypeCreated(AircraftTypeCreated e) { }
    protected void OnAircraftTypeUpdated(AircraftTypeUpdated e) { }
    // ...
}

// This can be called from anywhere in my application, once the 
// EF-based transaction has succeeded:

new FleetManagementEventSource().Raise(new AircraftTypeUpdated { ... });
...