4

我们正在使用 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。

除了将设计更改为使用工厂之外,有没有办法在 StructureMap 中进行装饰性配置(我们使用的是 2.6.4.1)

4

2 回答 2

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");
于 2013-03-13T08:39:37.207 回答
0

我不敢相信这是您应用程序ICatIDog接口的实际名称,因此我无法对该设计提供真正的反馈。但是,总的来说,我会说您的设计中存在歧义,导致您出现这种情况。与其使您的 DI 配置复杂化,不如敦促您仔细查看设计并查看是否不应该修复它。

于 2013-03-13T09:56:07.337 回答