2016-11-17 137 views
-2

我有一個面試問題,大致問了以下幾點:使用依賴注入,你如何防止所有的類被實例化?如果你只想要一些,但不是全部?他們說,有很好的理由,例如爲了避免它們同時在內存中...如何防止依賴注入的類實例化?

我試圖研究這個問題,但很難找出最佳搜索術語。我找不到答案。

+2

假設的問題沒有意義。沒有實例化「所有類」的DI容器,以便它們都「同時在內存中」。一個容器僅僅實例化了它所要求的內容,因此一個有效的,儘管沒有意義的答案可能是「阻止容器創建實例的一種方法,不是要求它提供實例」。我想我們還需要你記得提出更好的答案。 –

+0

我不知道有更好的方法來問這個問題。在面試中這可能是個狡猾的問題。我不知道。我討厭這個問題很廣泛,它處於擱置狀態等等。我討厭得到低估而沒有提出如何讓這個問題變得更好,不那麼寬泛。 @WiktorZychla - 感謝您的反饋。 – NovaDev

+0

我不是一個低估了你的人,實際上我贊成你,因爲我不相信你的問題值得被低估。至於建議 - 我試着向你解釋,你問的問題沒有意義。所以要麼這個問題有所不同(這樣才能得到真正的答案),要麼你得到了一個不知道他們問的問題的無效問題。即使你接受的答案也表明,要求「實例化預防」是沒有意義的,因爲DI中沒有這樣的事情。 –

回答

1

一個簡單的方法是使用構造函數創建它,並根據標誌或開關實例化一個類。這是一個簡單的例子,它顯示只有一個OtherClassOtherClass2將被實例化。

但我想補充一點,它不是真正的依賴注入,它允許防止實例化。你可以擺脫DI並緊密耦合類,並且仍然有一個類的單個實例。所以,也許我不正確地理解這個問題,或者面試官是以不同的語境/方式來問它的?

class AppStart 
{ 
    OneClass One; 
    int _whatToCreate = 0; 

    public int WhatToCreate 
    { 
     get { return _whatToCreate; } 
     set { _whatToCreate = value; } 
    } 

    public void Start() 
    { 
     if (_whatToCreate > 0) 
     { 
      One = new OneClass(new OtherClass()); 
     } 
     else 
     { 
      One = new OneClass(new OtherClass2()); 
     } 

     One.PerformSomething(); 
    } 
} 

class OneClass 
{ 
    IDoSomething _doSomething; 

    public OneClass(IDoSomething doSomething) 
    { 
     _doSomething = doSomething; 
    } 

    public void PerformSomething() 
    { 
     _doSomething.DoSomething(); 
    } 
} 

class OtherClass : IDoSomething 
{ 
    public void DoSomething() 
    { 
     //throw new NotImplementedException(); 
    } 
} 

class OtherClass2 : IDoSomething 
{ 
    public void DoSomething() 
    { 
     //throw new NotImplementedException(); 
    } 
} 

interface IDoSomething 
{ 
    void DoSomething(); 
} 
+0

是的,我可能不記得所有這些細節,或者我被這個問題置之度外,或者......一些東西。但這是一個很好的答案,因爲它反映了我對此的一般想法。謝謝! – NovaDev