我想要使用IoC容器解决以下对象图:
此处,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。
B
,B
和C
是用户控件的一部分。 D
是一个DataContext,它包含两个用户控件实例。
答案 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} },B
和C
,这可以确保您只需使用D
的手动连接,这可以使您的依赖图最易于维护。