2010-10-31 3 views
1

Основываясь на documentation for Castle.Core.InterceptorAttribute, я пытаюсь сделать этот простой тест пройти, и не имею никакой удачи: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? Я не могу найти документацию на этот счет. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Я использую версию замка 2.5 и 4.0 версию .Net Framework.

ответ

1

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

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

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

ОТВЕТ: Вам не нужно делать метод виртуальным в классе impl в этом случае.

Смежные вопросы