Château Interceptor Fluent Interface
-
19-09-2019 - |
Question
Je suis en train d'obtenir un intercepteur j'ai écrit au travail, mais pour une raison quelconque, il ne semble pas être instanciation l'intercepteur quand je demande mes composants. Je fais quelque chose comme ça (pardonnez-moi si cela ne compile pas tout à fait, mais vous devriez obtenir l'idée):
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)));
Je l'ai mis dans le constructeur des points d'arrêt pour l'Interceptor et il ne semble pas être l'instanciation du tout.
Dans le passé, je me suis inscrit mes intercepteurs en utilisant la configuration XML, mais je suis impatient d'utiliser l'interface fluide.
Toute aide serait grandement appréciée!
La solution
Je pense que vous êtes abusant WithService.FromInterface
. Les docs disent:
Utilise des outils pour rechercher les sous interface. Par exemple: si vous avez IService et IProductService: ISomeInterface, IService, ISomeOtherInterface. Quand vous appelez FromInterface (typeof (IService)) puis IProductService sera utilisé. Utile lorsque vous souhaitez enregistrer tous votre services et mais souhaitez pas spécifier tous.
Vous manque aussi InterceptorGroup Anywhere
.
Voici un exemple de travail, je l'ai changé aussi peu que possible de votre échantillon pour le faire fonctionner:
[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();
}
}