1

Castle.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()「From Service」を返します。この場合、仮想にする必要はないように思えますが、get()念のためそうしました。コンテナーに Interceptor 属性を認識させるためにここに登録する必要がある機能はありますか? その趣旨のドキュメントは見つかりません。誰かが私が間違っていることを教えてもらえますか?

Castle バージョン 2.5 と .Net Framework の 4.0 バージョンを使用しています。

4

1 に答える 1

1

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

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

それ以外の場合は、WindsorContainer代わりに使用してください (推奨)。

ところで: この場合、impl クラスでメソッドを virtual にする必要はありません。

于 2010-10-31T22:43:33.840 に答える