如何让Cirqus停止自动创建新实例?

时间:2015-09-02 08:03:03

标签: cqrs cirqus

我有一个带有一些事件和命令的聚合根。其中一个命令是 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 包含更多代码,可以发出一些事件来立即更新已创建实例的某些属性,但我删除了它们,因为它们对于这个问题并不重要。

1 个答案:

答案 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}}方法来确保现有实例不会意外正在解决。