Castle.Core.interceptorattribute не инъекционно перехватчик
-
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()
Виртуал, но сделал это просто, чтобы быть уверенным. У меня есть ощущение, что я скучаю с чем-то очевидным и фундаментальным здесь, например, есть ли объект, который необходимо зарегистрировать здесь, чтобы сделать контейнер в курсе атрибута перехватчика? Я не могу найти никакой документации к этому эффекту. Может кто-нибудь сказать мне, что я делаю не так?
Я использую Castle версию 2.5 и версию 4.0 .NET Framework.
Решение
Если вы собираетесь использовать DefaultKernel
Прямо, вы должны настроить прокси-завод:
var container = new DefaultKernel {ProxyFactory = new DefaultProxyFactory()};
В противном случае просто используйте WindsorContainer
вместо этого (рекомендуется).
BTW: Вам не нужно делать метод виртуальным в нуме в этом случае в этом случае.