Domanda

In base alla documentazione per Castle.Core.InterceptorAttribute , io sto cercando di fare questo semplice passaggio di prova, e sto avendo fortuna:

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

In un passo attraverso le prove, instance non è un proxy e get() restituisce "dal servizio". Mi sembra che in questo caso, non avrei bisogno di fare get() virtuale, ma lo ha fatto solo per essere sicuri. Ho la sensazione che mi manca qualcosa ovvio e fondamentale qui, come c'è una struttura che deve essere registrato qui per rendere il contenitore consapevoli dell'attributo Interceptor? Non riesco a trovare alcuna documentazione in tal senso. Qualcuno può dirmi che cosa sto facendo male?

Sto usando Castello di versione 2.5 e la versione 4.0 del Framework .Net.

È stato utile?

Soluzione

Se avete intenzione di utilizzare direttamente il DefaultKernel, è necessario impostare la fabbrica del proxy:

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

In caso contrario, solo l'uso WindsorContainer invece (consigliato).

A proposito:. Non è necessario per rendere il metodo virtuale nella classe impl in questo caso

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top