Castle.Core.Interceptor属性没有注入拦截
-
27-09-2019 - |
题
根据对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()
虚拟的,但那样的话只是要确定。我有一种感觉,我缺少明显的东西,在这里根本,就像是有一个设施,需要在这里注册,使容器意识到拦截属性?我无法找到该效果的任何文件。谁能告诉我什么,我做错了什么?
我使用的城堡版本2.5和4.0版本的.Net Framework。
解决方案
如果你要直接使用DefaultKernel
,你必须设置代理厂家:
var container = new DefaultKernel {ProxyFactory = new DefaultProxyFactory()};
否则,只是使用WindsorContainer
代替(推荐)。
BTW:你不需要使该方法在这种情况下,实现类的虚拟
不隶属于 StackOverflow