在命令中重用对象命令以获取对象集合

时间:2014-09-18 21:14:02

标签: c# .net cqrs

我有一个CommandHandler,它为对象实现一些逻辑并提交上下文(在我的例子中是RavenDb IDocumentSession)。我需要为一组对象实现相同的逻辑。第一个想法是创建一个新的CommandHandler,它将为foreach中的每个对象调用第一个CommandHandler。但它会导致N个数据库往返。

我最好的想法是使用逻辑本身创建一个基本CommandHandler但没有上下文提交。像这样:

internal class AuditProductCommandHandler : AuditProductCommandHandlerBase, ICommandHandler<AuditProductCommand>
{
    private readonly IDocumentSession _documentSession;

    public AuditProductCommandHandler(IDocumentSession documentSession)
    {
        _documentSession = documentSession;
    }

    public void Execute(AuditProductCommand command)
    {
        AuditProduct(command.Product);

        _documentSession.SaveChanges();
    }
}

internal class AuditProductsCommandHandler : AuditProductCommandHandlerBase, ICommandHandler<AuditProductsCommand>
{
    private readonly IDocumentSession _documentSession;

    public AuditProductsCommandHandler(IDocumentSession documentSession)
    {
        _documentSession = documentSession;
    }

    public void Execute(AuditProductsCommand command)
    {
        foreach (var product in command.Products)
        {
            AuditProduct(product);
        }

        _documentSession.SaveChanges();
    }
}

internal class AuditProductCommandHandlerBase
{
    protected void AuditProduct(Product product)
    {
      //logic itself 
    }
}

出于某种原因,我对这个解决方案感到不舒服。还有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

我建议从命令处理程序实现中完全删除_documentSession.SaveChanges()并将责任移交给调用者。然后,调用者可以决定是否必须链接多个命令处理程序或多个DB操作,然后在此之后调用SaveChanges()。由于调用者负责创建/发送IDocumentSession对象,因此他们也可以负责保存和处理它。