こんにちは、私はすべてのプロジェクトで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();
}
}
Mutex デコレータ:
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)装飾したいコマンドごとに新しいクラスを作成する必要がありますか(コマンドごとに一意のロックオブジェクトがあることを確認するため)、または(傍受を使用して)より良い方法がありますか?
上記を行うための最良の方法についてアドバイスをいただければ幸いです。
ありがとう、
クリス