我有一個面試問題,大致問了以下幾點:使用依賴注入,你如何防止所有的類被實例化?如果你只想要一些,但不是全部?他們說,有很好的理由,例如爲了避免它們同時在內存中...如何防止依賴注入的類實例化?
我試圖研究這個問題,但很難找出最佳搜索術語。我找不到答案。
我有一個面試問題,大致問了以下幾點:使用依賴注入,你如何防止所有的類被實例化?如果你只想要一些,但不是全部?他們說,有很好的理由,例如爲了避免它們同時在內存中...如何防止依賴注入的類實例化?
我試圖研究這個問題,但很難找出最佳搜索術語。我找不到答案。
一個簡單的方法是使用構造函數創建它,並根據標誌或開關實例化一個類。這是一個簡單的例子,它顯示只有一個OtherClass
或OtherClass2
將被實例化。
但我想補充一點,它不是真正的依賴注入,它允許防止實例化。你可以擺脫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();
}
是的,我可能不記得所有這些細節,或者我被這個問題置之度外,或者......一些東西。但這是一個很好的答案,因爲它反映了我對此的一般想法。謝謝! – NovaDev
假設的問題沒有意義。沒有實例化「所有類」的DI容器,以便它們都「同時在內存中」。一個容器僅僅實例化了它所要求的內容,因此一個有效的,儘管沒有意義的答案可能是「阻止容器創建實例的一種方法,不是要求它提供實例」。我想我們還需要你記得提出更好的答案。 –
我不知道有更好的方法來問這個問題。在面試中這可能是個狡猾的問題。我不知道。我討厭這個問題很廣泛,它處於擱置狀態等等。我討厭得到低估而沒有提出如何讓這個問題變得更好,不那麼寬泛。 @WiktorZychla - 感謝您的反饋。 – NovaDev
我不是一個低估了你的人,實際上我贊成你,因爲我不相信你的問題值得被低估。至於建議 - 我試着向你解釋,你問的問題沒有意義。所以要麼這個問題有所不同(這樣才能得到真正的答案),要麼你得到了一個不知道他們問的問題的無效問題。即使你接受的答案也表明,要求「實例化預防」是沒有意義的,因爲DI中沒有這樣的事情。 –