需要根据StructureMap中请求的父类型来不同地配置依赖关系

时间:2013-03-12 00:20:24

标签: c# .net dependency-injection inversion-of-control structuremap

我们正在使用StructureMap,并试图找出如何实现以下目标。

我们有2个接口:  ICat,IDog

对于ICat,我们需要使用Cat的实例。 Cat构造函数采用ISound的实例。

对于IDog,我们需要使用Dog的实例。 Dog构造函数也采用了ISound的实例。

ISound有一个实现AnimalSound。

到目前为止一切顺利。这部分我们可以很容易地在结构图中做到。

现在问题出现在AnimalSound上。 AnimalSound有一个构造函数,可以使用LoudSound或SoftSound进行初始化。 (LoudSound和SoftSound共享相同的界面IVolume)

我们希望所有的Cats都被赋予一个用SoftSound构建的AnimalSound,并且所有的Dogs都是用用LoudSound构造的AnimalSound构建的。

如果没有更改设计以使用Factory,有没有办法在StructureMap中装饰性地配置它(我们使用的是2.6.4.1)

2 个答案:

答案 0 :(得分:1)

使用命名实例,您可以这样做:

For<ISound>().Add<AnimalSound>().Ctor<IVolume>().Is<LoudSound>().Named("Loud");
For<ISound>().Add<AnimalSound>().Ctor<IVolume>().Is<SoftSound>().Named("Soft");
For<ICat>().Use<Cat>().Ctor<ISound>().Named("Soft");
For<IDog>().Use<Dog>().Ctor<ISound>().Named("Loud");

答案 1 :(得分:0)

我无法相信ICatIDog是应用程序中接口的实际名称,因此我无法真正反馈该设计。但是,总的来说,我会说你的设计存在模糊性,导致你遇到这种情况。您可以不要让DI配置复杂化,而是要仔细查看设计并查看是否应该修复。