سؤال

أحاول الحصول على اعتراضي كتبته للعمل، ولكن لسبب ما لا يبدو أنه مفهيم اعتراضي عندما أطلب مكوناتي. أنا أفعل شيئا كهذا (سامحني إذا لم يترجم هذا تماما، ولكن يجب أن تحصل على الفكرة):

container.Register(
    Component.For<MyInterceptor>().LifeStyle.Transient,
    AllTypes.Pick().FromAssembly(...).If(t => typeof(IView).IsAssignableFrom(t)).
    Configure(c => c.LifeStyle.Is(LifestyleType.Transient).Named(...).
                   Interceptors(new InterceptorReference(typeof(MyInterceptor)).
    WithService.FromInterface(typeof(IView)));

لقد وضعت نقاط التوقف في منشئ اعتراضي ولا يبدو أنها مثيل لها على الإطلاق.

في الماضي لقد سجلت اعتراضي باستخدام تكوين XML، لكنني حريص على استخدام الواجهة بطلاقة.

أي مساعدة سيكون موضع تقدير كبير!

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

المحلول

أعتقد أنك إساءة استخدام WithService.FromInterface. وبعد يقول المستندات:

يستخدم تنفيات للبحث عن الواجهة الفرعية. على سبيل المثال: إذا كان لديك iService و IPRODUCTSERVICE: ISOMEINTFACE، ISSERVICE، ISOMEORSINTFACE. عند الاتصال FunInterface (TypeOf (iService)) ثم سيتم استخدام IPRoDuctSService. مفيدة عندما تريد التسجيل الكل خدماتك ولكن لا ترغب في تحديد كل منهم.

أنت أيضا في عداد المفقودين InterceptorGroup Anywhere. وبعد إليك عينة عمل، قمت بتغييرها بأقل قدر ممكن من عينتك لجعلها تعمل:

[TestFixture]
public class PPTests {
    public interface IFoo {
        void Do();
    }

    public class Foo : IFoo {
        public void Do() {}
    }

    public class MyInterceptor : IInterceptor {
        public void Intercept(IInvocation invocation) {
            Console.WriteLine("intercepted");
        }
    }

    [Test]
    public void Interceptor() {
        var container = new WindsorContainer();

        container.Register(
            Component.For<MyInterceptor>().LifeStyle.Transient,
            AllTypes.Pick()
                .From(typeof (Foo))
                .If(t => typeof (IFoo).IsAssignableFrom(t))
                .Configure(c => c.LifeStyle.Is(LifestyleType.Transient)
                                    .Interceptors(new InterceptorReference(typeof (MyInterceptor))).Anywhere)
                .WithService.Select(new[] {typeof(IFoo)}));

        container.Resolve<IFoo>().Do();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top