سؤال

على أساس توثيق Castle.core.InterceptorAttribute, ، أحاول إجراء هذا الاختبار البسيط ، وليس لدي حظ:

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

في التجول في الاختبارات ، instance ليس وكيل و get() يعود "من الخدمة". يبدو لي أنه في هذه الحالة ، لا أحتاج إلى صنع get() افتراضي ، لكنه فعل ذلك فقط للتأكد. لدي شعور بأنني أفتقد شيئًا واضحًا وأساسيًا هنا ، مثل هل هناك منشأة يجب تسجيلها هنا لجعل الحاوية على دراية بسمات التقاطع؟ لا يمكنني العثور على أي وثائق بهذا المعنى. هل يمكن لأحد أن يخبرني بما أفعله خطأ؟

أنا أستخدم Castle الإصدار 2.5 وإصدار 4.0 من .NET Framework.

هل كانت مفيدة؟

المحلول

إذا كنت ستستخدم DefaultKernel مباشرة ، يجب عليك إعداد مصنع الوكيل:

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

خلاف ذلك ، فقط استخدم WindsorContainer بدلا من ذلك (الموصى بها).

راجع للشغل: لا تحتاج إلى جعل الطريقة افتراضية في فئة الصقل في هذه الحالة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top