2012-04-03 7 views
2

ジェネリック型パラメータを持つ次のクラスがあります。構造マップを使用してジェネリック型パラメータの抽象型を置換する

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

  • ILoggerです - > Log4NetLogger
  • DataString - > XmlDataString
  • 構造マップサイトは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番目のバージョンをどのように改善するか?

    +0

    'ObjectFactory.GetInstance ()'を呼び出すとどうなりますか?それでも問題が解決しない場合は、IContentService→ContentService をweb.configに追加できませんか? – svick

    +0

    ありがとう@svick、それは動作します。私はサービス全体を注入するだけです。私はコード内でこれを行うことができました: 'x.For ()。>();' を使用しましたが、web.configに入れる方法を見つけることができませんでした(< & >のエンコードは機能しません) – mafue

    答えて

    1

    最初にObjectFactory.GetInstance<ContentService<DataString>>()と書くと、ContentService<XmlDataString>は元に戻せません。これは互換性のない別の種類のためです。

    実際にはIContentServiceが必要なので、それを書きます:ObjectFactory.GetInstance<IContentService>()。これにより、登録したIContentServiceの実装が返されます。登録するには、ContentService<XmlDataString>IContentServiceに登録する必要があります。 DataStringXmlDataStringが登録されているということは、これとは関係ありません。

    web.configでジェネリックタイプContentService<XmlDataString>を表すのに問題がある場合は、ジェネリックタイプ(およびC#のものではない)の.Net表現を使用すると効果があると思います。あなたのケースでは、それはおそらくContentService`1[[XmlDataString]]のようなものになります。恐らく名前空間とおそらくアセンブリが追加されています。

    +0

    私は自分の依存関係を分割して別々に注入しようとしていましたが、今は必要ではありませんでした。答えをありがとう! 他の誰かがweb.configのジェネリック型を表すのに苦しんでいる場合、私のために働いたのは次のとおりです。 ' 'IContentService、{assembly1}" PluggedType = – mafue

    関連する問題