2012-01-17 196 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(除非其他一些部件需要),但只是把它傳遞到您的安裝程序的構造函數:

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

注意,最後一次通話將嘗試再次實例化PluginInstaller ,所以避免這種情況的最簡單方法就是讓班級內部化。