ジェネリック型パラメーターを持つ次のクラスがあります。
public class ContentService<T> : IContentService where T : DataString, new()
{
public ContentService(IEnvironment environment,
ILogger logger)
{
_environment = environment;
_logger = logger;
}
...
}
DataString は抽象クラスであり、アプリケーションが ContentService のインスタンスを作成するたびに、Structure Map が具体的な実装 (XmlDataString) を使用するようにします。これを行うと、構造マップはすでに IEnvironment と ILogger の具体的な実装を注入しています。
バージョン 1:
_contentService = ObjectFactory.GetInstance<ContentService<DataString>>();
...しかし、ステップスルーすると、XmlDataString ではなく、DataString の型パラメーターを使用して ContentService が作成されます。デフォルトのインスタンスを設定する web.config に次の 3 つのエントリがあります。
- IEnvironment -> TestEnvironment
- ILogger -> Log4NetLogger
- データ文字列 -> XmlDataString
構造マップのサイトには、ジェネリックについてこう書かれていますが、その例を実際の問題に関連付けることはできないようです。
このアプローチは機能しますが、コンストラクターの引数の自動配線が失われており、非常に見苦しく見えます: バージョン 2:
Type typeOfDataString = ObjectFactory.GetInstance<DataString>().GetType();
Type genericClass = typeof(ContentService<>);
Type constructedClass = genericClass.MakeGenericType(typeOfDataString);
_contentService = (IContentService)Activator.CreateInstance(constructedClass,
ObjectFactory.GetInstance<IEnvironment>(),
ObjectFactory.GetInstance<ILogger>());
最初のバージョンで何が間違っているか、または 2 番目のバージョンをどのように改善できるか教えてもらえますか?