我有一个带有一些事件和命令的聚合根。其中一个命令是 CreateCommand 。该命令应该创建具有给定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 包含更多代码,可以发出一些事件来立即更新已创建实例的某些属性,但我删除了它们,因为它们对于这个问题并不重要。
答案 0 :(得分:1)
您可以使用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
的{{1}}方法来确保现有实例不会意外正在解决。