Los interceptores Castillo con Fluido Interfaz
-
19-09-2019 - |
Pregunta
Estoy intentando conseguir un interceptor que he escrito para el trabajo, pero por alguna razón no parece ser una instancia del interceptor cuando solicito mis componentes. Estoy haciendo algo como esto (perdóname si esto no acaba de compilar, pero usted debe tener una 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)));
He puesto los puntos de interrupción en el constructor para el interceptor y no parece ser una instancia de ella en absoluto.
En el pasado he registrado mi interceptores utilizando la configuración XML, pero estoy dispuesto a usar la interfaz fluida.
Cualquier ayuda sería muy apreciada!
Solución
Creo que estás haciendo mal uso WithService.FromInterface
. Los documentos dicen:
Utiliza implementos para buscar el sub interfaz. Por ejemplo: si usted tiene IService y IProductService: ISomeInterface, IService, ISomeOtherInterface. Cuando usted llama FromInterface (typeof (IService)), entonces se utilizará IProductService. Útil cuando se desea registrar todos su servicios y sin querer especificar todos ellos.
También se está perdiendo el InterceptorGroup Anywhere
.
He aquí una muestra de trabajo, lo cambié lo menos posible de su muestra para hacer que funcione:
[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();
}
}