少し問題があります。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を使用する場合、これは正しい方法であるか、完全に間違ったパスにあります。非常に強力であるように思われるので、プロキシを使用しました。これらのプロキシを将来のプログラミング作業に使用する方法を理解したいと思います。