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

C# 依赖项需要根据StructureMap中请求的父类型进行不同的配置,c#,.net,dependency-injection,inversion-of-control,structuremap,C#,.net,Dependency Injection,Inversion Of Control,Structuremap,我们正在使用StructureMap,并试图找出如何实现以下目标 我们有两个接口: ICat,IDog 对于ICat,我们需要使用Cat的实例。Cat构造函数获取ISound的一个实例 对于IDog,我们需要使用和实例Dog。Dog构造函数还获取ISound的一个实例 ISound有一个实现AnimalSound 到目前为止还不错。这部分我们可以很容易地在结构图中完成 这个问题现在出现在AnimalSound上。AnimalSound有一个构造函数,可以用LoudSound或SoftSound初

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

我们有两个接口: ICat,IDog

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

对于IDog,我们需要使用和实例Dog。Dog构造函数还获取ISound的一个实例

ISound有一个实现AnimalSound

到目前为止还不错。这部分我们可以很容易地在结构图中完成

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

我们希望所有的猫都有一个用柔和声音构造的动物声音,所有的狗都有一个用响声构造的动物声音


除了将设计更改为使用工厂外,是否有办法在StructureMap(我们使用的是2.6.4.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");
For().Add().Ctor().Is().Named(“Loud”);
For().Add().Ctor().Is()命名为(“软”);
For().Use().Ctor().Named(“Soft”);
For().Use().Ctor().Named(“Loud”);

我不相信
ICat
IDog
是应用程序中接口的实际名称,因此我无法对该设计进行反馈。然而,总的来说,我想说的是,在您的设计中存在着模糊性,这会导致您出现这种情况。与其使DI配置复杂化,不如敦促您仔细研究一下设计,看看它是否应该被修复