我有一个包含一些事件和命令的聚合根。其中一个命令是创建命令。该命令应该使用给定的ID创建一个新的聚合根。所有其他事件/命令应该只更新一个现有的聚合根,如果给定ID的聚合根不存在, 将失败。
我怎样才能让Cirqus这样工作?
这是我如何配置我的CommandProcessor:
var commandProcessor = CommandProcessor
.With()
#if DEBUG
.Logging(l =>
{
if (_useConsoleForLogging)
{
l.UseConsole(Logger.Level.Debug);
}
else
{
l.UseDebug(Logger.Level.Debug);
}
})
#endif
.EventStore(e => e.UseSqlServer(_connectionString, _eventsTableName))
.EventDispatcher(e => e.UseViewManagerEventDispatcher(viewManagers))
.Create();
这是CreateCommand:
public class CreateCommand : ExecutableCommand
{
public CreateCommand()
{
CreatedGuid = Guid.NewGuid();
}
public Guid CreatedGuid { get; }
public override void Execute(ICommandContext context)
{
var root = context.Create<MyAggregateRoot>(CreatedGuid.ToString());
}
}
当然,这个CreateCommand包含更多的代码,发出一些事件来立即更新创建的实例的一些属性,但是我已经删除了它们,因为它们对这个问题不是至关重要的。
您可以通过使用ExecutableCommand
来实现您自己的更新命令-您可以将其称为UpdateCommand
。
可以是这样的:
public abstract class UpdateCommand<TAggregateRoot>
{
readonly string _aggregateRootId;
protected UpdateCommand(string aggregateRootId)
{
_aggregateRootId = aggregateRootId;
}
public override void Execute(ICommandContext context)
{
var instance = context.Load<TAggregateRoot>(_aggregateRootId);
Update(instance);
}
public abstract void Update(TAggregateRoot instance);
}
,然后所有从UpdateCommand
派生的命令如果试图处理不存在的实例将会遇到异常。
类似地,您可以确保使用CreateCommand
基类创建,该基类将使用ICommandContext
的Create<TAggregateRoot>
方法来确保不会意外地寻址现有实例。