2

少し問題があります。CastleWindsorIOCコンテナで作業しています。今、私がやりたかったのは、いくつかのAOPの原則をいじくり回すことであり、私が具体的にやりたいことは、メソッド名に基づいて、いくつかのロギングを実行することです。私はインターセプターを見てきましたが、現時点では、クラスとして実装されたIInterceptorインターフェースを使用して、アスペクトを使用してこのロギングを実行しています。問題は、特定のメソッドでロギングを実行したい場合、メソッド名などをチェックするために実装されたアスペクトにロジックを入れる必要があるため、面倒になります...

ダイナミックプロキシとIInterceptorSelectorインターフェイスおよびIProxyGenerationHookインターフェイスを使用してこれらすべてを実行できることを読みました。私はこれがネット上で行われたいくつかの例を見てきましたが、これがすべてウィンザーコンテナにどのように適合するかについてはかなり混乱しています。つまり、私のコードでは実際にはIWindsorContainerインターフェイスへの参照であるwindsorコンテナを使用して、すべてのオブジェクトを作成しています。私の設定はすべて、XMLではなくコードで行われます。

まず、私が現在行っている方法以外に、ウィンザーコンテナでメソッド固有のAOPを実行する方法を知っている人はいますか。

次に、ウィンザーコンテナでダイナミックプロキシを使用するにはどうすればよいですか?

以下に、プロキシを作成し、クラスをインターセプターに登録するコードを追加しました

ProxyGenerator _generator = new ProxyGenerator(new PersistentProxyBuilder());
IInterceptorSelector _selector = new CheckLoggingSelector();
var loggingAspect = new LoggingAspect();
var options = new ProxyGenerationOptions(new LoggingProxyGenerationHook()) 
                  { Selector = _selector };
var proxy = _generator.CreateClassProxy(typeof(TestClass), options, loggingAspect);
TestClass testProxy = proxy as TestClass;

windsorContainer.Register(
Component.For<LoggingAspect>(),
Component.For<CheckLoggingAspect>(),
Component.For<ExceptionCatchAspect>(),
Component.For<ITestClass>()
    .ImplementedBy<TestClass>()
    .Named("ATestClass")
    .Parameters(Parameter.ForKey("Name").Eq("Testing"))
    .Proxy.MixIns(testProxy));

テストクラスは以下のとおりです。

public class TestClass : ITestClass
{
    public TestClass()
    {

    }        

    public string Name
    {
        get;
        set;
    }
    public void Checkin()
    {
        Name = "Checked In";
    }
}

インターセプターに関しては、それらは非常に単純で、名前がCheckで始まる場合はメソッドを入力するだけです。

コンテナからTestClassを解決すると、エラーが発生します。

{"これはDynamicProxy2エラーです:ミックスインタイプTestClassProxyはDynamicProxyインフラストラクチャインターフェイスであるIProxyTargetAccessorを実装しているため、自分で実装しないでください。既存のプロキシをミックスしようとしていますか?"}

プロキシを間違った方法で使用していることは知っていますが、ウィンザーコンテナでプロキシを使用する方法の具体的な例を見たことがないので、ちょっと混乱します。

つまり、「チェック」という単語で始まるメソッドに対してインターセプターに最初に指示するLoggingProxyGenerationHookを使用する場合、これは正しい方法であるか、完全に間違ったパスにあります。非常に強力であるように思われるので、プロキシを使用しました。これらのプロキシを将来のプログラミング作業に使用する方法を理解したいと思います。

4

1 に答える 1

3

使用.Interceptors()することで、すでに動的プロキシを使用しています。コンポーネントがインターセプターを指定すると、Windsor はそのプロキシーを作成し、これらのインターセプターを使用します。メソッド.SelectedWith.Proxyプロパティを使用して、DynamicProxy から既に知っている他のオプションを設定することもできます。

Windsor AOP に関する Web サイトをドキュメンテーション wiki に追加しました。まだそれほど多くはありませんが、私 (と Mauricio ;) ) が必要なすべての情報をそこに入れます。見て、すべてが明確であるかどうか、何か不足している場合はお知らせください。

于 2010-02-24T20:05:17.427 に答える