在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
每个实例,我希望c
和d
使用的D
是D
的单个实例。 当我创建A
的新实例(比如使用工厂)时,我希望c
和d
共享一个新的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,则可以使用它而不是直接调用。
此外,如果您只解析一个“顶级”组件,则可以省略显式创建上下文。