簡體   English   中英

Castle.Core.InterceptorAttribute不注入攔截器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM