2010-10-31 11 views
1

Basé sur le documentation for Castle.Core.InterceptorAttribute, je suis en train de faire passer ce test simple, et ai pas de chance:Castle.Core.InterceptorAttribute pas injecter intercepteur

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")); 
    } 
} 

En parcourant les essais, instance n'est pas un proxy et get() renvoie "De service". Il me semble que dans ce cas, je ne devrais pas besoin de faire get() virtuel, mais l'ai fait juste pour être sûr. J'ai le sentiment qu'il me manque quelque chose d'évident et de fondamental ici, comme est-ce qu'il y a une installation qui doit être enregistrée ici pour rendre le container conscient de l'attribut Interceptor? Je ne trouve aucune documentation à cet effet. Quelqu'un peut-il me dire ce que je fais mal? J'utilise Castle version 2.5 et la version 4.0 de .Net Framework.

Répondre

1

Si vous allez utiliser le DefaultKernel directement, vous devez mettre en place l'usine de proxy:

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

Sinon, il suffit d'utiliser à la place WindsorContainer (recommandé).

BTW: vous n'avez pas besoin de rendre la méthode virtuelle dans la classe impl dans ce cas.