2011-10-29 6 views
2

からすべてのプロバイダクラスは、どのようにソリューションフォルダ内の各クラスの1つのインスタンスをインスタンス化するには?フォルダ内のすべてのクラスを反復処理する方法は何ですか?ロード異なる論理プロバイダをサポートする.NETアプリケーションを考えるとソリューションフォルダ

たとえば、私のソリューションにはMailClientProviders と呼ばれるフォルダがあります。OutlookとThe Bat! IMailProviderインターフェイスを実装するプロバイダクラス。私のApp.xamlで

私はNinjectコンテナがすべての依存関係を初期化するために呼び出します。それから私は呼び出すメソッドを書く必要があり、返された各クラスのインスタンスを取得します。

heartbeatService.Providers = CreateOneInstanceOfAllClassesInProvidresDir(MailClientProviders); 

CreateOneInstanceOfAllClassesInProvidresDir方法には何でしょうか?

+1

MEFは、より適していると思われますこの種の仕事... AFAIKは、Ninjectなどと統合/統合することができます。 – Yahia

+1

MEFは私が持っている小さなアプリのオーバーヘッドのようです。 –

+0

「MEF」は_.NET4_に統合されていますが、私はあなたのアプリケーションの過度の攻撃ではないと思います。 'MEF'は簡単で、あなたが必要な正確に何を行い、ガイドは[こちら](http://mef.codeplex.com/wikipage?title=Guide&referringTitle=Documentation)を参照してください! – ordag

答えて

2

私は私のカスタムインターフェイスを実装したフォルダ内のすべてのクラスを取得するために、これらの機能を使用:

public static List<T> GetFilePlugins<T>(string filename) 
{ 
    List<T> ret = new List<T>(); 
    if (File.Exists(filename)) 
    { 
     Type typeT = typeof(T); 
     Assembly ass = Assembly.LoadFrom(filename); 
     foreach (Type type in ass.GetTypes()) 
     { 
      if (!type.IsClass || type.IsNotPublic) continue; 
      if (typeT.IsAssignableFrom(type)) 
      { 
       T plugin = (T)Activator.CreateInstance(type); 
       ret.Add(plugin); 
      } 
     } 
    } 
    return ret; 
} 
public static List<T> GetDirectoryPlugins<T>(string dirname) 
{ 
    List<T> ret = new List<T>(); 
    string[] dlls = Directory.GetFiles(dirname, "*.dll"); 
    foreach (string dll in dlls) 
    { 
     List<T> dll_plugins = GetFilePlugins<T>(Path.GetFullPath(dll)); 
     ret.AddRange(dll_plugins); 
    } 
    return ret; 
} 

ですから、GetDirectoryPlugins<IMailProvider>を実行し、見つかったすべてのクラスでActivator.CreateInstanceを使用することができます...

3

Directory.GetFiles("MailClientProviders", "*.dll") は、各返された結果のために、その後Assembly.LoadFrom、フォルダ内のすべてのDLLをフェッチすると、各アセンブリAssembly.GetTypesのすべてのパブリック型を取得するために、それぞれのタイプのためにそれが必要なインターフェイスを実装している場合検査し、それがActivator.CreateInstanceを行う場合は、それをインスタンス化します。

関連する問題