Frage

Basierend auf der Dokumentation für Castle.Core.InterceptorAttribute , ich versuche zu machen dieser einfache Testdurchlauf, und habe kein Glück:

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

durch die Tests in Schritt ist instance kein Proxy und get() returns "Vom Service". Es scheint mir, dass in diesem Fall sollte ich nicht get() virtuellen müssen, aber haben so nur um sicher zu sein. Ich habe das Gefühl, ich etwas offensichtliche und grundlegende bin fehlt hier, wie es ist eine Einrichtung, die Bedürfnisse hier registriert werden, um den Behälter sich der Interceptor-Attribut zu machen? Ich kann keine Dokumentation zu diesem Zweck finden. Kann mir jemand sagen, was ich falsch mache?

Ich verwende Castle Version 2.5 und die 4.0-Version des .NET Framework.

War es hilfreich?

Lösung

Wenn Sie vorhaben, die DefaultKernel direkt zu verwenden, müssen Sie die Proxy-Fabrik einzurichten:

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

Ansonsten nur Gebrauch WindsorContainer statt (empfohlen).

BTW:. Sie brauchen nicht die Methode virtuell in der impl Klasse in diesem Fall zu machen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top