2

我有以下对象图,我想使用 IoC 容器来解决:

在此处输入图像描述

在这里,B(#1)andB(#2)是相同类型但不同的实例,与C(#1)andC(#2)D(#1)and相同D(#2)。我想解决A

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

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

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

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

BC并且D是用户控件的一部分。A是一个包含两个用户控件实例的 DataContext。

4

2 回答 2

1

您可以使用工厂方法:

For<B>().Use(s => 
{
    var d = s.GetInstance<D>();
    var c = new C(d);
    return new B(c,d);
});
于 2013-11-01T10:32:21.820 回答
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, B,CD,因此可以确保您只需要退回到使用手动A连线依赖图是最可维护的。

于 2013-11-01T11:03:52.123 回答