Castle.Core.InterceptorAttribute не вводит перехватчик - PullRequest
1 голос
/ 01 ноября 2010

Основываясь на документации для 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 и 4.0 .Net Framework.

1 Ответ

1 голос
/ 01 ноября 2010

Если вы собираетесь использовать DefaultKernel напрямую, вам нужно настроить фабрику прокси:

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

В противном случае, просто используйте WindsorContainer (рекомендуется).

Кстати, в этом случае вам не нужно делать метод виртуальным в классе impl.

...