我正在试图找出在两个依赖它的类之间共享一个类实例的最佳方法。
说我有这些课程:
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
的每个实例,我希望D
和c
使用的d
成为D
的单个实例。当我创建A
的新实例(比如使用工厂)时,我希望c
和d
共享D的新实例。
到目前为止,我已经认为使用使用上下文的自定义生活方式(使用this酷库)可能是最好的方法。所以我会做这样的事情:
WindsorContainer container = new WindsorContainer();
[.. standard container registration stuff ..]
container.Register(Component.For<D>().LifeStyle.Custom<ContextualLifestyle>());
IAFactory factory = container.Resolve<IAFactory>();
using (new ContainerContext(container))
{
A a = factory.GetA();
}
现在我遇到的问题是我必须在使用工厂时定义上下文。理想情况下,当我注册所有类型时,D
是半瞬态的并且每个A
实例应该有一个实例的概念将在容器中配置。另一个问题是上下文需要一个容器本身的实例,这违反了三个容器调用模式。
任何人都可以提出更好的方法来设置这种东西,无论是使用Windsor还是使用更好的架构。还要注意D在类heirarchy中可能相当深,即A -> B -> C -> E -> F -> G -> D
,我想避免将D
一直传递到树下。
答案 0 :(得分:3)
如果你想在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<D>().LifeStyle.Custom<ContextualLifestyle>());
A a = container.Resolve<A>();
如果你的IAFactory是使用container.Resolve实现的,你可以使用它而不是直接调用。
此外,如果您只解析一个“顶级”组件,则可以省略显式创建上下文。