Schloss Interceptor mit Fluent Interface
-
19-09-2019 - |
Frage
Ich versuche, einen Abfangjäger erreiche ich Arbeit geschrieben habe, aber aus irgendeinem Grunde scheint es nicht Instanziieren das Interceptor zu sein, wenn ich meine Komponenten anfordern. Ich bin so etwas wie dies zu tun (verzeihen Sie mir, wenn dies nicht ganz kompilieren, aber man sollte auf die Idee kommen):
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)));
Ich habe in dem Konstruktor setzt Grenzwerte für den Interceptor und es scheint nicht, es überhaupt zu instanziieren werden.
In der Vergangenheit hat ich meinen Abfangjäger mit der XML-Konfiguration registriert, aber ich bin daran interessiert, die fließend Schnittstelle zu verwenden.
Jede Hilfe wäre sehr dankbar!
Lösung
Ich glaube, Sie mißbrauchen WithService.FromInterface
. Die docs sagen:
Verwendet implementiert das Unter zum Nachschlagen Schnittstelle. Zum Beispiel: Wenn Sie IService und IProductService: ISomeInterface, IService, ISomeOtherInterface. Wenn du anrufst FromInterface (typeof (IService)), dann IProductService verwendet. Nützlich wenn Sie registrieren möchten alle Ihre Dienstleistungen und aber nicht festlegen möchten, alle von ihnen.
Sie fehlt auch die InterceptorGroup Anywhere
.
Hier ist eine Arbeitsprobe, habe ich es so wenig wie möglich von Ihrer Probe, damit es funktioniert:
[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();
}
}