4

StructureMap を使用しており、次のことを達成する方法を見つけようとしています。

2 つのインターフェイスがあります: ICat、IDog

ICat の場合、Cat のインスタンスを使用する必要があります。Cat コンストラクターは、ISound のインスタンスを取ります。

IDog の場合は、Dog のインスタンスを使用する必要があります。Dog コンストラクターは、ISound のインスタンスも受け取ります。

ISound には、1 つの実装 AnimalSound があります。

ここまでは順調ですね。この部分は、構造マップで非常に簡単に実行できます。

この問題は、AnimalSound で発生します。AnimalSound には、LoudSound または SoftSound で初期化できるコンストラクタがあります。(LoudSound と SoftSound は同じインターフェース IVolume を共有します)

すべての Cat には、SoftSound で構築された AnimalSound が与えられ、すべての Dog には、LoudSound で構築された AnimalSound が構築される必要があります。

Factory を使用するようにデザインを変更する以外に、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

と がアプリケーションの実際のインターフェース名であるICatとは信じられないため、その設計について実際にフィードバックすることはできません。IDogただし、一般的に、この状況につながる設計にはあいまいさがあると言えます。DI 構成を複雑にする代わりに、設計をよく見て、修正すべきでないかどうかを確認することをお勧めします。

于 2013-03-13T09:56:07.337 に答える