解决共享瞬态实例的位置

时间:2013-11-01 07:21:02

标签: c# ioc-container structuremap

我想要使用IoC容器解决以下对象图:

enter image description here

此处,B(#1)B(#2)属于同一类型,但实例不同,与C(#1)C(#2)D(#1)和{{1}相同}。我想解决D(#2)

问题在于,A有两个实例,其他四个对象具有依赖关系。根据我设置D生命周期的方式,我将获得一个所有人共享的实例,或者我将获得四个不同的实例。

我目前正在使用StructureMap,但如果需要StructureMap没有的某些功能,解决方案可以使用另一个IoC容器。

实际使用案例(根据评论中的要求):

对象图在WPF应用程序中找到,我将典型MVVM ViewModel的职责分离为ViewModel和Controller。在上图中,D是仅包含状态的ViewModel,D是执行命令的Controller。 C是XAML绑定的DataContext。

BBC是用户控件的一部分。 D是一个DataContext,它包含两个用户控件实例。

2 个答案:

答案 0 :(得分:1)

您可以使用工厂方法:

For<B>().Use(s => 
{
    var d = s.GetInstance<D>();
    var c = new C(d);
    return new B(c,d);
});

答案 1 :(得分:1)

我认为诀窍是按照请求注册D(这是StructureMap的默认生活方式)并为A明确解决两个B的注册:

For<A>().Use(s => 
{
    var b1 = s.GetInstance<B>();
    var b2 = s.GetInstance<B>();
    return new A(b1, b2);
});

这可确保对于B的每个已解析图表,只有一个D,因为您的对象图可能不只是A,{{1} },BC,这可以确保您只需使用D的手动连接,这可以使您的依赖图最易于维护。