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

时间:2011-01-31 09:43:37

标签: c# .net inversion-of-control 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的每个实例,我希望Dc使用的d成为D的单个实例。当我创建A的新实例(比如使用工厂)时,我希望cd共享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一直传递到树下。

1 个答案:

答案 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实现的,你可以使用它而不是直接调用。

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