Pregunta

Sobre la base de la documentación href="http://stw.castleproject.org/Windsor.Interceptors.ashx" para Castle.Core.InterceptorAttribute , yo estoy tratando de hacer este sencillo paso de la prueba, y estoy teniendo suerte:

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 caminar a través de las pruebas, instance no es un proxy y get() devuelve "del servicio". Me parece que en este caso, no debería ser necesario para hacer get() virtual, pero lo hizo sólo para estar seguro. Tengo la sensación de que me falta algo obvio y fundamental aquí, al igual que hay una instalación que debe registrarse aquí para hacer el recipiente conscientes del atributo Interceptor? No puedo encontrar ninguna documentación a tal efecto. ¿Puede alguien decirme lo que estoy haciendo mal?

Estoy utilizando Castillo versión 2.5 y la versión 4.0 del marco .NET.

¿Fue útil?

Solución

Si usted va a utilizar el DefaultKernel directamente, tiene que configurar el proxy de fábrica:

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

De lo contrario, el uso justo WindsorContainer lugar (recomendado).

Por cierto:. No es necesario hacer que el método virtual en la clase impl en este caso

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top