По словам Питера, основного участника 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 { ... });