2

別のクラスのインスタンスへの呼び出しをインターセプトする動的プロキシを提供するためのウィンザーの使用と構成に関する情報を探しています。

私のクラスは、パフォーマンス上の理由から、コンテナによって長寿命のインスタンスとして保持される必要があるリソースを表しています。ただし、このリソースは使用できない状態に移行する場合があり、更新が必要になります。クライアント コードで処理する必要がないように、コンテナーでこれを処理する必要があります。これを行うために独自のファクトリを作成できます。別のファクトリ クラスを作成する必要がないので、Windsor 登録のクールネスがあるかどうかを知りたいです :)

問題を示す擬似コードを次に示します。

public interface IVeryImportantResource
{
    void SomeOperation();
}

public class RealResource : IVeryImportantResource
{
    public bool Corrupt { get; set; }

    public void SomeOperation()
    {
        //do some real implementation
    }
}

public class RealResourceInterceptor : IInterceptor
{
    private readonly IKernel kernel;

    public RealResourceInterceptor(IKernel Kernel)
    {
        kernel = Kernel;
    }

    public void Intercept(IInvocation invocation)
    {
        RealResource resource = invocation.InvocationTarget as RealResource;

        if(resource.Corrupt)
        {
            //tidy up this instance, as it is corrupt
            kernel.ReleaseComponent(resource);
            RealResource newResource = kernel.Resolve<RealResource>(); //get a new one
            //now what i would like to happen is something like this
            //but this property has no setter, so this doesn't work
            //also, i would like to know how to register RealResourceInterceptor as well RealResourceInterceptor
            invocation.InvocationTarget = newResource;
        }
        invocation.Proceed();
    }
}

私の RealResourceInterceptor クラスのようなものを実装する方法と、それを使用するようにコンテナを構成する方法はありますか? ありがとう!

4

2 に答える 2

2

この質問は、インターセプトよりもシングルトン コンポーネントの更新に関するものです。シングルトンの更新の問題は、この質問で回答されています。

結論: 見た目ほど簡単ではありません。このアプローチには多くの落とし穴があります。

おそらく問題は、このコンポーネントが破損していることにあります (なぜこれが起こるのですか?)

于 2009-02-17T02:01:52.347 に答える
0

私のオブジェクトは WCF プロキシです。これらのオブジェクトは障害状態に移行し、使用できなくなります。それらがいつ移行するか、または移行するかどうかを制御することはできません。それが起こったことを検出し、新しいプロキシを再作成することしかできません。

リンクをありがとう、以下に引用されたセクションは、私が現在それをどのように行っているかを大まかに説明しています:

別の方法として、サービスのデコレーターをシングルトン ライフスタイルでコンテナーに登録し、実際の基になるサービスを一時的なライフスタイルでコンテナーに登録する方法があります。コンポーネントを更新する必要がある場合は、保持されている一時的な基になるコンポーネントを破棄するだけです。デコレータによって解決され、新しく解決されたインスタンスに置き換えられます (デコレータを取得しないように、サービスではなくコンポーネント キーを使用して解決します) - これにより、他のシングルトン サービス (「更新」されていない) の問題が保持されなくなります。古いサービスは破棄されて使用できなくなりましたが、機能させるには少しキャストなどが必要です

私の質問は、これらのいずれかではなく、次のとおりです。

1) 静的に型指定されたデコレータを使用して、私の RealResource をラップします (上記のように)。これらのプロキシを多数取得すると、それらすべてのデコレータを作成するのが面倒になります。

2) 動的プロキシを作成するファクトリ オブジェクトを使用して、WCF プロキシの状態を管理します。

2)ははるかに優れていますが、ウィンザーがすでに私のためにできるかもしれないことのようです. それで、自分の工場を作成する代わりに、構成時にインターセプターを登録できるコンテナの自動魔法があるかどうか知りたいですか?

この疑似コードのようなもの:

container.AddComponent("dynamicProxyWrapper", typeof(IRealResource), typeof(RealResource)).UsingInterceptor(typeof(RealResourceInterceptor));
于 2009-02-17T09:47:38.450 に答える