はい。なぜできなかったのかわかりません。でも...
インターセプトを使用すると、クリーンでSOLIDの設計が必要になることがよくありますが、これを実行する場合は、SOLIDの設計が必要です。
これを可能にするこの種の設計についてここICommandHandler<T>
で説明しましたが、結局のところ、メソッドを使用するなど、設計の背後にラップする操作をモデル化する必要がありますHandle(T)
。このような設計を使用すると、実際のクラスを次のような子コンテナーを追加するクラスでラップするデコレーター(またはUnityの場合はインターセプター)を作成できます。
public class ChildContainerCommandHandlerDecorator<T>
: ICommandHandler<T>
{
private readonly ICommandHandler<T> decorated;
private readonly Container container;
public ChildContainerCommandHandlerDecorator(
ICommandHandler<T> decorated, Container container)
{
this.decorated = decorated;
this.container = container;
}
public void Handle(T command)
{
using (container.CreateChildContainer())
{
this.decorated.Handle(command);
}
}
}
そして、次のようなトランザクションスコープを追加するデコレータ:
public class TransactionCommandHandlerDecorator<T>
: ICommandHandler<T>
{
private readonly ICommandHandler<T> decorated;
public TransactionCommandHandlerDecorator(
ICommandHandler<T> decorated)
{
this.decorated = decorated;
}
public void Handle(T command)
{
using (var scope = new TransactionScope())
{
this.decorated.Handle(command);
scope.Complete();
}
}
}
両方のデコレータで実際のハンドラをラップすることにより、この動作でハンドラを拡張できます。もちろん、デコレータはUnityでは処理できない概念ですが、Unityを使用する場合はインターセプターを使用して簡単に書き直すことができますが、ここでも、優れたデザインが唯一の友です。