2012-03-15 84 views
6

什麼是做下面讓ParentClass不依賴於MyClass正確的方法是什麼?依賴注入的循環

public class ParentClass 
{ 
    public void MyFunction(IList<Foo> foos) 
    { 
     foreach (var bar in foos) 
     { 
      var myClass = new MyClass(); 
      myClass.DoStuff(); 
     } 
    } 
} 

通常沒有一個循環我剛剛與父類的構造函數注入它,但在這裏我需要的是一個新的實例爲循環的每個迭代。

或許還有乾脆更好的辦法做我想要達到什麼目的?也許myClass可以在每次迭代結束時自行重置,以便我可以重用它?

+0

那麼,爲什麼不定義對象的集合,或者只是定義DoStuff爲靜態在創建新實例,並扔掉立刻 – 2012-03-15 16:46:25

回答

7

您可以將一個創建MyClass實例的工廠對象注入到ParentClass中。

對於每個循環迭代,你叫工廠對象,因此它給你的MyClass一個新的實例。

+1

當對象具有進一步的依賴性時,如何在工廠內創建對象?在這種情況下,我們必須將容器本身注入工廠。我在這裏看到兩個警告 - 注入容器並使用container.Resolve(服務定位器)。這是建議嗎?任何其他方法? – hungryMind 2016-04-29 09:21:04

+0

這是一個很好的問題,@hungryMind,我認爲你應該把它作爲一個真正的問題提升到SO,並將其與這個問題聯繫起來。無論如何,我發現這篇文章提供了一些選擇:http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/ – Fabio 2016-04-29 17:03:25

1

您可以在構造函數中注入Func<IMyClass>,然後調用它多次,你想要得到不同的實例。

像Autofac這樣的IoC框架本身就支持這一點。

+0

我跟你aggree。但是,我會建議不要使用任何IoC容器,直到它成爲必需:DTSTTCPW(做最簡單的想法,可能可行) – Skyp 2012-03-15 16:48:56

+0

@Skyp'最簡單'是一個沒有目標或目標的模糊概念。如果單元測試是一個目標,那麼使用IoC是最簡單的工作之一。 – 2012-03-15 17:34:51

0

這真的取決於你想用MyClass做什麼。就目前而言,foo,酒吧和MyClass之間沒有關聯。假設你要麼將Bar注入到MyClass的Ctor中,要麼將它作爲參數傳遞給DoStuff,那麼我只需將一個工廠類或方法注入到ParentClass Ctor中,並用它來代替新建的MyClass。

0

你提出的注入是可讀的,可以理解的,容易驗證其正確性。

如果循環很大或者如果MyClass創建開銷很大(例如打開連接,文件句柄,子進程或啓動線程),則重置對象是一個選項。

由於reset()解決方案需要更多的時間和精力來驗證每次代碼更改,所以我建議在打擾之前實際測量這是一個瓶頸。