Dependency injection 不同依赖项的不同Castle拦截器实例

Dependency injection 不同依赖项的不同Castle拦截器实例,dependency-injection,castle-windsor,Dependency Injection,Castle Windsor,我有一个Castle Windsor拦截器,我想用于两个不同的接口(只需将它们称为IOne和ITwo)。与本文类似,我希望拦截器对于相同的接口是一个单例,但是对于每个接口是一个不同的实例。显然,将拦截器注册为singleton会导致在IOne和ITwo的所有实例中重用相同的实例。我需要拦截器以这种方式工作,因为我需要它们为通过该接口的所有调用保留状态,但它们需要彼此不同 我遇到了很多可能的方法来解决这个问题,但既然我不是温莎的专家,那么处理这种情况的首选方法是什么 表示建议使用具有瞬时生命周期的

我有一个Castle Windsor拦截器,我想用于两个不同的接口(只需将它们称为IOne和ITwo)。与本文类似,我希望拦截器对于相同的接口是一个单例,但是对于每个接口是一个不同的实例。显然,将拦截器注册为singleton会导致在IOne和ITwo的所有实例中重用相同的实例。我需要拦截器以这种方式工作,因为我需要它们为通过该接口的所有调用保留状态,但它们需要彼此不同

我遇到了很多可能的方法来解决这个问题,但既然我不是温莎的专家,那么处理这种情况的首选方法是什么

表示建议使用具有瞬时生命周期的拦截器

使拦截器暂时失效

强烈建议您始终制作拦截器 转瞬即逝的因为拦截器可以用 不同的生活方式如果他们自己的寿命不超过 他们拦截的组件。除非你有很好的理由 不要,总是让它们短暂


我建议将共享数据交互重构到另一个接口,然后将其作为单例使用。

另一种方法是使拦截器通用。然后可以使用接口的泛型参数指定拦截器

public class MyInterceptor<T> : IInterceptor
{
    ...
}
公共类MyInterceptor:IInterceptor
{
...
}
然后像这样注册

container.Register(Component.For<IOne>()
                            .ImplementedBy<OneImplementation>()
                            .Interceptors<MyInterceptor<IOne>>());
container.Register(Component.For<ITwo>()
                            .ImplementedBy<TwoImplementation>()
                            .Interceptors<MyInterceptor<ITwo>>());
container.Register(Component.For())
.由()实施
.Interceptors());
container.Register(Component.For())
.由()实施
.Interceptors());
.Net将把
MyInterceptor
MyInterceptor
识别为单独的类,因此Windsor将为它们创建不同的单例实例


当然,这只有在你制造拦截器时才有效。如果它位于某个您无法访问的库中,那么您的应用程序就不可能使用这种方法。

如果它位于库中,您仍然可以从中派生泛型类并使用该类。