我有一个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
}
}
出于某种原因,我对这个解决方案感到不舒服。还有更好的选择吗?
答案 0 :(得分:1)
我建议从命令处理程序实现中完全删除_documentSession.SaveChanges()
并将责任移交给调用者。然后,调用者可以决定是否必须链接多个命令处理程序或多个DB操作,然后在此之后调用SaveChanges()
。由于调用者负责创建/发送IDocumentSession
对象,因此他们也可以负责保存和处理它。