Castelo interceptores Com interface fluente
-
19-09-2019 - |
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!
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();
}
}