我有一个面试问题,大致问了以下几点:使用依赖注入,你如何防止所有的类被实例化?如果你只想要一些,但不是全部?他们说,有很好的理由,例如为了避免它们同时在内存中...如何防止依赖注入的类实例化?
我试图研究这个问题,但很难找出最佳搜索术语。我找不到答案。
我有一个面试问题,大致问了以下几点:使用依赖注入,你如何防止所有的类被实例化?如果你只想要一些,但不是全部?他们说,有很好的理由,例如为了避免它们同时在内存中...如何防止依赖注入的类实例化?
我试图研究这个问题,但很难找出最佳搜索术语。我找不到答案。
一个简单的方法是使用构造函数创建它,并根据标志或开关实例化一个类。这是一个简单的例子,它显示只有一个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中没有这样的事情。 –