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!

¿Fue útil?

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();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top