ジェネリック型パラメータを持つ次のクラスがあります。構造マップを使用してジェネリック型パラメータの抽象型を置換する
public class ContentService<T> : IContentService where T : DataString, new()
{
public ContentService(IEnvironment environment,
ILogger logger)
{
_environment = environment;
_logger = logger;
}
...
}
DataStringは抽象クラスであり、私は自分のアプリケーションがContentServiceのインスタンスを作成するたびに構造マップは、具体的な実装(XmlDataString)を使用します。
バージョン1:構造マップは、私がこれを行う際に、既にIEnvironmentとILoggerですが、具体的な実装を注入され
_contentService = ObjectFactory.GetInstance<ContentService<DataString>>();
を...しかし、私はステップスルーするとき、ContentServiceはDataStringの型パラメータを使用して作成された、ではありませんXmlDataString。 - > TestEnvironment
構造マップサイトはthisがあり
- IEnvironment:私は、デフォルトのインスタンスを設定してweb.configファイルでこれらの3つのエントリを持っていますジェネリックについては、私は実際の問題にその例を関連付けることはできません。
このアプローチは動作しますが、私は、コンストラクタの引数の自動配線を失うことだし、それは非常に醜い: バージョン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番目のバージョンをどのように改善するか?
'ObjectFactory.GetInstance()'を呼び出すとどうなりますか?それでも問題が解決しない場合は、IContentService→ContentService をweb.configに追加できませんか? –
svick
ありがとう@svick、それは動作します。私はサービス全体を注入するだけです。私はコード内でこれを行うことができました: 'x.For()。>();' を使用しましたが、web.configに入れる方法を見つけることができませんでした(< & >のエンコードは機能しません) –
mafue