2016-11-17 53 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