Castle.Core.InterceptorAttribute不注入拦截器

时间:2010-10-31 21:03:13

标签: castle-windsor iinterceptor interceptor

基于documentation for 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()返回“来自服务”。在我看来,在这种情况下,我不需要让get()虚拟,但这样做只是为了确定。我觉得我在这里缺少一些明显和基本的东西,比如是否需要在这里注册以使容器知道Interceptor属性?我找不到任何相关的文档。有人能告诉我我做错了吗?

我正在使用Castle版本2.5和.Net Framework的4.0版本。

1 个答案:

答案 0 :(得分:1)

如果您要直接使用DefaultKernel,则必须设置代理工厂:

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

否则,只需使用WindsorContainer代替(推荐)。

顺便说一句:在这种情况下,你不需要在impl类中创建虚拟方法。