我正在尝试使用我编写的拦截器来工作,但出于某种原因,当我请求我的组件时它似乎并没有实例化拦截器。我正在做这样的事情(原谅我,如果这不完全编译,但你应该明白):
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)));
我在Interceptor的构造函数中放置了断点,它似乎根本没有实例化它。
过去我使用XML配置注册了我的拦截器,但我很想使用流畅的界面。
非常感谢任何帮助!
答案 0 :(得分:6)
我认为你在滥用WithService.FromInterface
。文档说:
使用工具查找sub 接口。例如:如果你有 IService和IProductService: ISomeInterface,IService, ISomeOtherInterface。你打电话的时候 FromInterface(typeof(IService))然后 将使用IProductService。有用 当你想注册所有你的 服务,但不想指定 所有这些。
你也错过了InterceptorGroup Anywhere
。
这是一个工作样本,我从样本中尽可能少地改变它以使其工作:
[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();
}
}