在Castle Windsor的其他课程之间共享课程实例

我试图找出在依赖它的两个其他类之间共享类的实例的最佳方法。

说我有这些课程:

class A { public A(B b, C c) {} } class B { public B(IDFactory factory) {} } class C { public C(IDFactory factory) {} } interface IDFactory { D GetD(); } class D {} 

对于A每个实例,我希望cd使用的DD的单个实例。 当我创建A的新实例(比如使用工厂)时,我希望cd共享一个的D实例。

到目前为止,我已经认为使用使用上下文的自定义生活方式(使用这个很酷的库)可能是最好的方法。 所以我会做这样的事情:

 WindsorContainer container = new WindsorContainer(); [.. standard container registration stuff ..] container.Register(Component.For().LifeStyle.Custom()); IAFactory factory = container.Resolve(); using (new ContainerContext(container)) { A a = factory.GetA(); } 

现在我遇到的问题是我必须在使用工厂时定义上下文。 理想情况下,当我注册所有类型时, D是半瞬态的并且每个A实例应该有一个实例的概念将在容器中配置。 另一个问题是上下文需要一个容器本身的实例,这违反了三个容器调用模式。

任何人都可以建议一种更好的方法来设置这种东西,无论是使用Windsor还是使用更好的架构。 还要记住D在类heirarchy中可能相当深,即A -> B -> C -> E -> F -> G -> D我想避免将D一直向下传递到树上。

如果要在A的b和c依赖关系之间共享相同的D实例,那么这应该足够了:

 class A { public A(B b, C c) { } } class B { public B(D d) { } } class C { public C(D d) { } } ... container.Register(Component.For().LifeStyle.Custom()); A a = container.Resolve(); 

如果使用container.Resolve实现IAFactory,则可以使用它而不是直接调用。

此外,如果您只解析一个“顶级”组件,则可以省略显式创建上下文。