Question

Sur la base de la documentation Castle.Core.InterceptorAttribute, je suis en train de faire ce passage de test simple, et je suis pas avoir de chance:

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 rendement proxy et get() « du service ». Il me semble que dans ce cas, je ne devrais pas besoin de faire get() virtuelle, mais l'a fait juste pour être sûr. J'ai le sentiment que je manque quelque chose évidente et fondamentale ici, comme il est un établissement qui doit être enregistré ici pour faire le contenant au courant de l'attribut Interceptor? Je ne peux pas trouver toute la documentation à cet effet. Quelqu'un peut-il me dire ce que je fais mal?

J'utilise la version 2.5 Castle et la version 4.0 du Framework .Net.

Était-ce utile?

La solution

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

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

Dans le cas contraire, utilisez WindsorContainer à la place (recommandé).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top