我有一个Castle Windsor拦截器,我想用于两个不同的接口(只需将它们称为IOne和ITwo)。与此帖http://thatextramile.be/blog/2009/07/protecting-your-application-from-remote-problems/类似,我希望拦截器是相同接口的单例,但是每个接口都是不同的实例。显然,将拦截器注册为singleton会导致在IOne和ITwo的所有实例中重用相同的实例。我需要拦截器以这种方式运行,因为我需要它们通过该接口保留所有调用的状态,但它们需要彼此不同。
我遇到过很多可能的方法,但由于我不是温莎的专家,处理这种情况的首选方法是什么?
答案 0 :(得分:2)
Documentation表示建议使用具有瞬态生命周期的拦截器。
使拦截器暂时
强烈建议您始终制作拦截器 短暂的。由于拦截器可以拦截多个组件 各种生活方式如果他们自己的生命不再长久,那就是最好的 他们拦截的组件。所以,除非你有充分的理由 不要,总是让它们变得短暂。
我建议将共享数据交互重构为另一个接口,然后将其用作单例。
答案 1 :(得分:1)
另一种方法是使拦截器具有通用性。然后,您可以使用接口的泛型参数指定拦截器。
public class MyInterceptor<T> : IInterceptor
{
...
}
然后像这样注册
container.Register(Component.For<IOne>()
.ImplementedBy<OneImplementation>()
.Interceptors<MyInterceptor<IOne>>());
container.Register(Component.For<ITwo>()
.ImplementedBy<TwoImplementation>()
.Interceptors<MyInterceptor<ITwo>>());
.Net会将MyInterceptor<IOne>
和MyInterceptor<ITwo>
识别为单独的类,因此Windsor会为它们创建不同的单例实例。
当然,这只有在您制作拦截器时才有效。如果某个图书馆中您无权访问,那么您可以通过此方法解决问题。