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

本文关键字:类型 父类 配置 请求 关系 StructureMap 依赖 | 更新日期: 2023-09-27 18:03:30

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

我们有两个接口:ICat, IDog

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

对于IDog,我们需要使用Dog的一个实例。Dog构造函数也接受一个ISound的实例。

ISound有一个实现AnimalSound.

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

现在AnimalSound出现了这个问题。AnimalSound有一个构造函数,可以用LoudSound或SoftSound初始化。(LoudSound和SoftSound共享相同的接口IVolume)

我们希望给所有的猫一个用SoftSound构造的AnimalSound,给所有的狗一个用LoudSound构造的AnimalSound。

如果不改变设计来使用Factory,有没有办法在StructureMap(我们使用2.6.4.1)中进行装饰配置

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

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

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");

我无法相信ICatIDog是您应用程序中接口的实际名称,因此我无法真正反馈该设计。然而,总的来说,我想说的是,你的设计中存在歧义,导致你出现这种情况。与其使您的DI配置复杂化,不如督促您仔细检查一下设计,看看它是否不应该被修复。