[英]Castle.Core.InterceptorAttribute not injecting interceptor
根據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版本。
如果要直接使用DefaultKernel
,則必須設置代理工廠:
var container = new DefaultKernel {ProxyFactory = new DefaultProxyFactory()};
否則,請改用WindsorContainer
(推薦)。
順便說一句:在這種情況下,您無需在impl類中將方法虛擬化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.