質問

に基づく caster.core.interceptorattributeのドキュメント, 、私はこの簡単なテストパスをしようとしています、そして、運がありません:

using NUnit.Framework;
using Castle.DynamicProxy;
using Castle.Core;
using Castle.MicroKernel;
using Castle.MicroKernel.Registration;


public interface IIntercepted { string get(); }

[Interceptor(typeof(TestInterceptor))]
public class Intercepted : IIntercepted
{
    public virtual string get() { return "From Service"; }
}

public class TestInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        invocation.Proceed();
        invocation.ReturnValue = "From Proxy";
    }
}
[TestFixture]
public class TestFixture
{
    [Test]
    public void Test_interception()
    {
        var container = new DefaultKernel();
        container.Register(
            Component.For<TestInterceptor>().LifeStyle.Transient,
            Component.For<IIntercepted>().ImplementedBy<Intercepted>());

        var instance = container.Resolve<IIntercepted>();
        Assert.That(instance.get(), Is.EqualTo("From Proxy"));
    }
}

テストを介してステップする際に、 instance プロキシではありません get() 「サービスから」を返します。この場合、私は作る必要はないように思えます get() 仮想ですが、確かにそうしました。ここに明白で基本的な何かが欠けていると感じています。インターセプター属性をコンテナに認識させるためにここに登録する必要がある施設がありますか?その効果に関するドキュメントが見つかりません。誰かが私が間違っていることを教えてもらえますか?

キャッスルバージョン2.5と.NETフレームワークの4.0バージョンを使用しています。

役に立ちましたか?

解決

使用する場合 DefaultKernel 直接、プロキシファクトリーを設定する必要があります。

var container = new DefaultKernel {ProxyFactory = new DefaultProxyFactory()};

それ以外の場合は、使用するだけです WindsorContainer 代わりに(推奨)。

ところで:この場合、インプルクラスでメソッドを仮想的にする必要はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top