Intercettori Castello con Fluent Interface
-
19-09-2019 - |
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!
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();
}
}