2010-10-31 113 views
1

,我试图让这个简单的测试通不过,和我有没有运气:Castle.Core.InterceptorAttribute不注入基础上<a href="http://stw.castleproject.org/Windsor.Interceptors.ashx" rel="nofollow">documentation for Castle.Core.InterceptorAttribute</a>拦截

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和4.0版本的.Net框架。

回答

1

如果你打算直接使用DefaultKernel,你必须设置代理厂家:

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

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

顺便说一句:在这种情况下,您不需要在impl类中使方法变为虚拟。

相关问题