Pergunta

Com base no Documentação para Castle.core.interceptiontribute, Estou tentando fazer esse teste simples e não estou tendo sorte:

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

Ao passar pelos testes, instance não é um proxy e get() retorna "do serviço". Parece -me que, neste caso, não preciso fazer get() Virtual, mas o fez apenas para ter certeza. Tenho a sensação de que estou perdendo algo óbvio e fundamental aqui, como existe uma instalação que precisa ser registrada aqui para conscientizar o contêiner do atributo interceptador? Não consigo encontrar nenhuma documentação para esse efeito. Alguém pode me dizer o que estou fazendo de errado?

Estou usando o Castle versão 2.5 e a versão 4.0 da estrutura .NET.

Foi útil?

Solução

Se você vai usar o DefaultKernel Diretamente, você deve configurar a fábrica de proxy:

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

Caso contrário, basta usar WindsorContainer em vez disso (recomendado).

BTW: Você não precisa tornar o método virtual na classe Impl neste caso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top