嗨,我开始在我的所有项目中使用Simple Injector DI 容器,并且想要一些关于如何适应我的要求的强大功能的建议。
我有几个命令处理程序装饰器将包装命令:
public class TransactionCommandHandlerDecorator<TCommand>
: ICommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> handlerToCall;
private readonly IUnitOfWork unitOfWork;
public TransactionCommandHandlerDecorator(
IUnitOfWork unitOfWork,
ICommandHandler<TCommand> decorated)
{
this.handlerToCall = decorated;
this.unitOfWork = unitOfWork;
}
public void Handle(TCommand command)
{
this.handlerToCall.Handle(command);
unitOfWork.Save();
}
}
互斥装饰器:
public class TransactionCommandHandlerWithMutexDecorator<TCommand>
: ICommandHandler<TCommand>
{
private readonly ICommandHandler<TCommand> handlerToCall;
private readonly IUnitOfWork unitOfWork;
private static object Lock = new object();
public TransactionCommandHandlerWithMutexDecorator(
IUnitOfWork unitOfWork,
ICommandHandler<TCommand> decorated)
{
this.handlerToCall = decorated;
this.unitOfWork = unitOfWork;
}
public void Handle(TCommand command)
{
lock (Lock)
{
this.handlerToCall.Handle(command);
unitOfWork.Save();
}
}
}
在某些情况下,仅以这种阻塞方式包装一些命令(通过使用 TransactionCommandHandlerWithMutexDecorator)才有意义,并允许其他人在所有线程中不受限制地访问(使用 TransactionCommandHandlerDecorator),此外,如果互斥锁不在命令类型之间共享会很好 - 使用我当前的代码,锁是静态的,将在所有类型之间共享。
所以关于我的问题:
1) 我如何将 TransactionCommandHandlerWithMutexDecorator 应用于特定的命令或命令,其余的使用 TransactionCommandHandlerDecorator - 我会使用 ExpressionBuilt 事件吗?
2)我是否需要为我希望装饰的每个命令创建一个新类(以确保每个命令都有一个唯一的锁定对象),还是有更好的方法(使用拦截)?
感谢有关执行上述操作的最佳方法的建议。
谢谢,
克里斯