2013-09-25 100 views
2

我有一個使用Windsor構建的應用程序,此應用程序具有功能,而且這些組件在xml內手動註冊,其中也包含它們的配置。這是一個例子:Windsor安裝程序配置

<component type="type"> 
    <parameters> 
     [...] 
    </parameters> 
</component> 

我決定修改我的組件並將它們分成溫莎安裝,安裝一個每項功能。我現在的問題是決定在每個安裝程序中註冊組件的配置。

在做出這個決定之前,用戶可以在xml的參數元素中找到適當的組件配置,並且我不必編寫線程邏輯來工作。

現在我有點困惑,因爲它好像我沒有這種自動化。自從我決定通過XML聲明我的應用程序的安裝,我認爲這可能是完美的,如果我可以把這個配置的installr元素中是這樣的:

<installers> 
<install assembly="myassembly"> 
    <parameters> 
    [...] 
    <parameters> 
</install> 
</installers> 

我不知道,如果溫莎支持此語法。如果確實如此,我想知道如何從安裝程序內部訪問它,以及如何將它連接到我的組件和服務。

另一個accettable替代的方法是創建和XML的註冊包含我的功能的所有配置的組件:

<components> 
<component type="featureConfiguration"> 
    <parameters> 
    </parameters> 
</component> 
</components> 

在這種情況下,我想我需要修改我的成分,讓他們接受這種類型的作爲它們的構造函數中的參數,而在我有直接的屬性之前,換句話說,在我能夠通過查看代碼確切地說明我的組件的依賴性之前,我將這個新的形式傳遞給它們,但我不知道在這個或那個組件中已經使用了什麼特定的配置屬性。

要使用第二個解決方案並避免這種混淆,我應該避免將整個配置傳遞給我的子組件,並讓該單個屬性完成工作,但我必須在此配置組件的屬性安裝程序的組件和服務的屬性。

我認爲這不是一個組成部分,我也可以把我所有的XML配置的屬性的元素:

<properties> 
<featureConfiguration> 
    [property list] 
</featureConfiguration> 
</properties> 

但同樣,我必須找到在列表中,每個單個屬性之間的粘合劑我的組件的屬性。

任何幫助表示讚賞。

謝謝。

回答

2

也許您會發現這種混合解決方案很有用,具體取決於您需要的組件參數化級別。也就是說,您可以在安裝程序中執行組件註冊,並將組件的參數設置爲windsor配置文件。這對於Windsor處理所有其他依賴項時需要少量組件的參數化需求很有用。

例如: 假設您擁有以下組件。

public class MyComponent 
{ 
    public MyComponent(MyDependency dependency, string stringParameter, DateTime dateParameter) 
    { 
     this.Dependency = dependency; 
     this.StringParameter = stringParameter; 
     this.DateParameter = dateParameter; 
    } 

    public DateTime DateParameter { get; set; } 

    public string StringParameter { get; set; } 

    public MyDependency Dependency { get; set; } 
} 

public class MyDependency 
{ 
} 

然後你可以使用下面的安裝程序來註冊它們。

public class MyInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Component.For<MyComponent>().Named("MyComponent")); 
     container.Register(Component.For<MyDependency>()); 
    } 
} 

注意,我們已經明確的有關組件的唯一名稱,設置爲MyComponent的。但是你也可以使用默認的全名。

溫莎配置文件看起來是這樣的:

<configuration> 
    <components> 
     <component id="MyComponent"> 
      <parameters> 
       <stringParameter>Some string</stringParameter> 
       <dateParameter>2013/09/25</dateParameter> 
      </parameters> 
     </component> 
    </components> 
</configuration> 

現在你可以用它一起:

WindsorContainer container = new WindsorContainer(); 
container.Install(Configuration.FromXmlFile("windsor.config")); 
container.Install(FromAssembly.This()); 

注意,調用安裝方法的順序很重要;您必須先安裝配置文件設置。