Pergunta

Eu estou tentando obter um interceptor que eu escrevi para o trabalho, mas por alguma razão, não parece ser instanciar o interceptor quando eu pedir meus componentes. Eu estou fazendo algo parecido com isto (perdoe-me se isto não chega a compilação, mas você deve ter a idéia):

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

Eu coloquei pontos de interrupção no construtor para o Interceptor e não parecem ser instanciar-lo em tudo.

No passado, eu tenha registrado meus interceptores usando a configuração XML, mas eu estou interessado em usar a interface fluente.

Qualquer ajuda seria muito apreciada!

Foi útil?

Solução

Eu acho que você está fazendo mau uso WithService.FromInterface. Os médicos dizem:

Usa implementos para procurar o sub interface. Por exemplo: se você tem IService e IProductService: ISomeInterface, IService, ISomeOtherInterface. Quando Você ligar FromInterface (typeof (IService)) então IProductService será usado. Útil quando você quiser registrar todas seu serviços e, mas não quer especificar todos eles.

Você também está perdendo o InterceptorGroup Anywhere. Aqui está um exemplo de trabalho, eu mudei o mínimo possível de sua amostra para que ele 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top