Ncqrsの主な寄稿者であるPieterによると、これを箱から出して行う方法はありません。
このシナリオでは、コマンドを作成して実行し、イベントを発行するためだけにイベントストアから集約ルートをロードするというセレモニー全体を実行したくありません。
動作は単純なCRUDであり、可能な限り単純なソリューションを使用して実装されます。この特定のケースでは、EntityFrameworkを使用したフォームオーバーデータです。必要なのは、トランザクションが発生するとイベントが公開されることだけです。
私の解決策は次のようになります。
// 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 { ... });