2012-01-17 22 views
1

私は、カスタムデータストアからコントロールコンテナ(Castle Windsor)の逆変換の設定データを読みたいと思うシナリオがあります。このカスタムデータストアには、システムに必要なインターフェイスを実装する一連の(潜在的に注文された)コンポーネントが一覧表示されたテーブルのような構造があります。IWindsorInstallerの実装への依存性の注入

たとえば、アプリケーションにはIFooの実装が必要ですが、その実装を含む実際のアセンブリとタイプはこのカスタムデータストアで定義されています。

私はIWindsorInstallerの実装をして、データ構造を読み込んで、IFooという正しい実装者を登録したいと考えています。しかし、カスタムデータストアに正しくアクセスするには、ファクトリクラス(IDataConnectionProviderインターフェイスを実装する)にアクセスする必要があります。このタイプは、コンテナに登録されているが、私はそれのような何かをするのが妥当であるかどうかを知りません:

var container = new WindsorContainer(); 
container.Register(Component.For<IDataConnectionProvider>. 
       ImplementedBy<DefaultDataConnectionProvider>. 
       DependsOn(new { host, service }); 
container.Install(FromAssembly.This()); 

をそして、アセンブリ内のクラスがあります。

public class PluginInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
    var dataStoreConnection = container.Resolve<IDataConnectionProvider>(); 
    // read table, register other services  
    } 
} 

が最善ということですが私がやろうとしていることをする方法?その他の提案?

答えて

0

はい、これはおそらく私がやることです。このため、プラグインインストーラ内のcontainerパラメータが正確に存在します。

hostserviceをコンテナ内に登録し、デフォルトのデータ接続プロバイダを自動的に接続することもできます。つまり、DependsOnは不要です。

0

一般的に、これはインストール処理が完了する前に何かを解決することはお勧めできません。

(いくつかの他のコンポーネントがあること必要としない限り)その代わり、私はコンテナにIDataConnectionProviderを登録していないだろうが、ちょうどあなたのインストーラのコンストラクタに渡し:最後の呼び出しが再びPluginInstallerをインスタンス化しようとすること

container.Install(
    new PluginInstaller(new DefaultDataConnectionProvider(){Host = host}, 
    FromAssembly.This() 
); 

お知らせ、それを回避する最も簡単な方法は、クラスを内部にすることです。

関連する問題