针对不同依赖关系的不同Castle拦截器实例

时间:2014-09-07 17:35:18

标签: dependency-injection castle-windsor

我有一个Castle Windsor拦截器,我想用于两个不同的接口(只需将它们称为IOne和ITwo)。与此帖http://thatextramile.be/blog/2009/07/protecting-your-application-from-remote-problems/类似,我希望拦截器是相同接口的单例,但是每个接口都是不同的实例。显然,将拦截器注册为singleton会导致在IOne和ITwo的所有实例中重用相同的实例。我需要拦截器以这种方式运行,因为我需要它们通过该接口保留所有调用的状态,但它们需要彼此不同。

我遇到过很多可能的方法,但由于我不是温莎的专家,处理这种情况的首选方法是什么?

2 个答案:

答案 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会为它们创建不同的单例实例。

当然,这只有在您制作拦截器时才有效。如果某个图书馆中您无权访问,那么您可以通过此方法解决问题。

相关问题