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



我有一个包含一些事件和命令的聚合根。其中一个命令是创建命令。该命令应该使用给定的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基类创建,该基类将使用ICommandContextCreate<TAggregateRoot>方法来确保不会意外地寻址现有实例。

相关内容

  • 没有找到相关文章

最新更新