2011-10-17 77 views
1

我在我的應用程序中使用Castle.Windsor。我的組件及其參數在app.config文件中配置。但我也希望能夠通過命令行參數傳遞參數。這意味着cmd-args > config-args。我試圖使用container.Resolve<Class>(dictionary)。但它不起作用(使用config-args)。奇怪的是,如果我使用匿名類型,它的作品。溫莎解決與參數字典

在此先感謝。

編輯

public class TestB 
{ 
    public string A { get; set; } 
    public string B { get; set; } 

    public TestB(string a) 
    { 
     A = a; 
     //B = b; 
    } 
} 

     [Test] 
    public void Test() 
    { 

     var dictionary = new Hashtable 
         { 
          { "a", "b" } 
         }; 

     var anonymousType = new 
          { 
           a = "b" 
          }; 

     WindsorContainer container = new WindsorContainer(new XmlInterpreter()); 

     var opt1 = container.Resolve<TestB>(anonymousType); 
     var opt2 = container.Resolve<TestB>(dictionary); 

     Assert.That(opt1.A == "b"); 
     Assert.That(opt2.A == "b"); 
    } 

這是怪異的。兩個斷言都成功了。但是,如果我交換opt1和opt2解析,斷言2失敗。

+0

你能告訴我們你的代碼與字典和匿名類型? – svick

回答

5

其原因是因爲依賴關係設置了兩次: - 首先作爲.ctor參數 - 然後再爲屬性

溫莎確實匹配時,非 - 案例敏感的參數名稱匹配您的來自xml config和匿名類型的參數以及您傳遞的內聯參數優先於xml,就像您期望的那樣。

然而,你給它一個Hashtable,你設置爲區分大小寫和溫莎榮幸。

所以它匹配a .ctor參數,但它然後去設置A屬性,並且Hashtable不提供一個值,因此它抓住你的一個XML。

關於

如果我換OPT1和OPT2 resolvations,斷言2失敗。

你不發表您的XML配置,但我懷疑組件的生活方式是單身,在這種情況下Resolve第二個呼叫只會給你第一次調用構造的對象,不管你的參數傳遞將被忽略。

通常情況下,你可能不會暴露setter的屬性通過.ctor設置,並保持它們只讀。

+0

我不確定爲什麼,但在將'set'的可訪問性修飾符更改爲private後,它可以工作。通常我總是將屬性設置器聲明爲私有,但這只是一個測試,它是否可以爲我工作:)謝謝! – Matthias

+0

如果您將屬性設置器設置爲私人,Windsor將不會嘗試設置它,因此xml中的值不會覆蓋通過.ctor從字典中設置的值 –