2012-03-19 51 views
0

起動時にIoC(Windsor v3.0)を使用して、インターフェイス/サービスを実装する場合はディレクトリ内のすべてのアセンブリをアプリケーションのコア用のリポジトリにロードするプログラムを作成しています。私は、しかし、ウィンザーの新人です。私のアプリはDBテーブルをポーリングし、処理が必要な行が見つかると、サービスの名前をチェックしてレコードを処理し、リポジトリから要求します。 this postのように、すべてのモジュールを辞書にロードし、次にリポジトリにロードすることができます。良いと、よく、私はそれはより動的にする必要があります。データ駆動型IoC

私は(擬似コード)、それを想像する方法:

List<string> enabledServices = GetServicesFromDb(); 
IDictionary<string, IModule> dict = new IDictionary<string, IModule>(); 

//Load the assemblies (This works currently!) 
_container.Register(AllTypes 
        .FromAssemblyInDirectory(new AssemblyFilter("Modules")) 
        .BasedOn<IModule>()); 

// Build dictionary 
foreach(string service in enabledServices) 
{ 
    foreach(?? asmble in _container.assemblies) 
    { 
     if(asmble.Id == service) 
      dict.Add(service, asmble); 
    } 
} 

// Register the repository from constructed dictionary 
_container.Register(
    Component 
    .For<IModuleRepository>() 
    .ImplementedBy<IntegrationRepository>() 
    .Parameters(new { modules = dict}) 
); 

リポジトリ:

public class IntegrationRepository : IModuleRepository 
{ 
    private readonly IDictionary<string, IModule> _modules; 

    public IntegrationRepository(IDictionary<string, IModule> modules) 
    { 
     _modules = modules; 
    } 

    public IModule GetModule(string moduleName) 
    { 
     return _modules.ContainsKey(moduleName) ? _modules[moduleName] : null; 
    } 
} 

はIModuleは次のようになります。

public interface IModule : IDisposable 
{ 
    string Id { get; } 
    string Description { get; } 
    bool Enabled { get; set; } 
    bool Validate(); 
    string EmailSubject { get; } 
} 

すべてのモジュール:

  1. 私は、コンテナを介して、またはその場合は反復処理する方法を知っているウィンザーでの十分な経験を持っていない

「モジュール」サブフォルダ

  • 共有に常駐
  • 共通の名前空間を「はIModule」インターフェースを実装可能、_container.ResolveAll();少なくとも私の心の中でそれを持っている方法で動作していないようです。

    私の考えは、オブジェクトが既に作成されている場合にオブジェクトを渡すことを暗示するthis exampleから来ています。 And thisは類似しています。 DictionaryAdapterFactory()でも面白いことがいくつかありましたが、使い方が分かりません。

    このようなことはありますか?何か案は?代わりに、このすべての

  • 答えて

    0

    あなただけグローバルにコンテナを保存することができますし、どこでもあなたのモジュールの完全な名前で

    _container.Resolve<IModule>(serviceFullName) 
    
    +0

    hmmm ... simplistic – sighlent

    +0

    なぜ複雑になるのですか? :) – maxlego

    0

    あなたのコンテナに使用可能なすべてのサービスを登録してからのみ返しプロバイダを作成することができますを解決することができますデータベースで有効になっているサービス。あなたのコンポーネントはもちろん、プロバイダーを通じてこれらのサービスにアクセスする必要があります。

    +0

    これはリポジトリを持つことの目標です。 :)私の質問は、最初の場所でリポジトリにアセンブリを流暢に取得する方法を中心にしています。辞書の代わりにコンテナをラップする必要があるかのように見えます。 – sighlent

    関連する問題