Domanda

Sto cercando di ottenere un intercettore che ho scritto al lavoro, ma per qualche motivo non sembra essere istanziare l'intercettore quando chiedo i miei componenti. Sto facendo qualcosa di simile (mi perdoni se questo non abbastanza compilazione, ma si dovrebbe ottenere l'idea):

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

ho messo i punti di interruzione nel costruttore per l'Interceptor e non sembra essere istanziare affatto.

In passato ho registrato il mio intercettori utilizzando la configurazione XML, ma sono desiderosi di utilizzare l'interfaccia fluida.

Qualsiasi aiuto sarebbe molto apprezzato!

È stato utile?

Soluzione

Credo che tu stia abusando WithService.FromInterface. La documentazione dicono:

  

Utilizza strumenti per cercare il sub   interfaccia. Per esempio: se si dispone di   IService e IProductService:   ISomeInterface, IService,   ISomeOtherInterface. Quando si chiama   FromInterface (typeof (IService)) allora   IProductService verrà utilizzato. Utile   quando si desidera registrare tutti il tuo   servizi e, ma non si desidera specificare   tutti loro.

Sei anche manca il InterceptorGroup Anywhere. Ecco un esempio di lavoro, ho cambiato il meno possibile dal vostro campione per farlo funzionare:

[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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top