2009-01-29 77 views
6

如何在使用IoC容器時處理基本類型?原始類型和IoC容器

I.e.鑑於你有:

class Pinger { 
    private int timeout; 
    private string targetMachine; 

    public Pinger(int timeout, string targetMachine) { 
     this.timeout = timeout; 
     this.targetMachine = targetMachine; 
    } 

    public void CheckPing() { 
     ... 
    } 
} 

你將如何獲得int和字符串構造函數參數?

+0

好問題! – Stimul8d 2010-09-16 10:26:41

回答

4

爲此創建另一個接口。

然後你會得到這樣的:

public Pinger(IExtraConfiguration extraConfig) 
{ 
    timeout = extraconfig.TimeOut; 
    targetmachine = extraconfig.TargetMachine; 
} 

我不知道其他的IOC容器,但溫莎城堡自動解決這些額外的構造函數的參數。

+0

這一方面不能解決問題,另一方面增加了複雜性。我們必須認識到,IoC有時會以非自然的方式扭曲你的代碼,並帶來消極的後果。如果您需要用各種Cupcake類型構建訂單,則必須注入一個實例並使用方法調用(強烈的氣味)進行變異。您可以注入一個上下文,但在運行時如何動態配置?你也必須改變這一點。有時間讓我們的頭離開沙灘,並接受IoC毫無疑問的美麗疣。 – 2017-01-15 18:27:36

1

這取決於。 IoC-Container StructureMap將允許您在開始執行時配置實例時聲明這些依賴關係。

例如在註冊表

ForRequestedType<Pinger>() 
    .TheDefault.Is.OfConcreteType<Pinger>() 
    .WithCtorArg("timeout").EqualTo(5000) 
    .WithCtorArg("targetMachine").EqualToAppSetting("machine"); 
1

在春天,人們可以從一個屬性文件中使用$ {propertyName的}符號查找屬性值

<bean class="blah.Pinger"> 
    <constructor-arg value="${blah.timeout}"/> 
    <constructor-arg value="${blah.targetMachine}"/> 
</bean> 

在Spring.net相同的功能是由PropertyPlaceholderConfigurer,提供了具有相同的語法,並在配置文件中使用名稱值部分。

3

我不確定您的難度是值類型還是具體類型。這也不是問題。你不需要引入一個配置接口(如果你想將相同的參數傳遞給多個對象,而不是你提供的情況,這很有用)。無論如何,這裏是溫莎流利的代碼,我相信有人會很快提交一個XML版本。

container.Register(
      Component.For(typeof(Pinger)) 
       .ImplementedBy(typeof(Pinger)) // This might not be necessary 
       .Parameters(Parameter.ForKey("timeout").Eq("5000"), 
          Parameter.ForKey("targetMachine").Eq("machine") 
       ) 
      );