2

Unityインターセプト/拡張/カスタムプロキシを使用してこれを実行できますか?

// psuedo-code
using (var childContainer = new container.CreateChildContainer())
using (var scope = new TransactionScope())
{
  childContainer.Resolve<TMyService>().PerformCall(...);
  scope.Complete();
}

現在、上記のコードはWCFの動作として実装されています。これで、WCF呼び出しを行うのではなく、このサービスレイヤーに直接アクセスするクラスができ、この動作が必要になります。興味深いのは、ユニティインターセプト内に子コンテナを作成する必要があることです。

4

2 に答える 2

2

はい。なぜできなかったのかわかりません。でも...

インターセプトを使用すると、クリーンで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を使用する場合はインターセプターを使用して簡単に書き直すことができますが、ここでも、優れたデザインが唯一の友です。

于 2012-11-04T21:11:07.533 に答える
0

いいえ、これを行う方法がわかりません。TransactionScopeの部分を実行することはできますが、解決/呼び出しの部分が機能していないようです。

まあ、私はあなたがそれを機能させることができると思います。TMyService(またはインターセプトしているオブジェクト)のダミーインスタンスが必要であり、インターセプト動作では、取得するタイプを把握して解決し、リフレクションを再度使用して特定の呼び出しを行うために、一連のリフレクションを実行する必要があります。方法。それは可能ですが、それは恐ろしく遅いでしょう。

これは良い考えではないと思うので、このためのコードは提供しません。これを使用してどのシナリオを実装しようとしていますか?おそらくそれを達成するためのより簡単な方法があります。

于 2012-11-04T18:53:46.773 に答える