Asp.net core I';我一直在研究何时使用工厂模式,何时进行依赖注入,一些答案是否定的;我不明白

Asp.net core I';我一直在研究何时使用工厂模式,何时进行依赖注入,一些答案是否定的;我不明白,asp.net-core,design-patterns,dependency-injection,factory,Asp.net Core,Design Patterns,Dependency Injection,Factory,我一直在研究一个遗留系统,我们想切断电源线,使一切现代化。为此,我开始研究解决旧系统中一些问题的模式。这里有很多关于工厂模式与依赖注入的主题,但答案对我来说并不总是有意义 答案倾向于表明DI更现代或更灵活,或者工厂模式仍然有其地位,它只是用于不同的情况。或者甚至两者都不是互斥的,可以同时实现。无论采用哪种方式,DI通常都更加灵活。如果要进行更改,则需要对factory模式做更多的工作。我想这取决于你想做什么样的改变,但对于典型的情况,我认为恰恰相反 假设我正在寻找打电话的解决方案。我们可以测试不

我一直在研究一个遗留系统,我们想切断电源线,使一切现代化。为此,我开始研究解决旧系统中一些问题的模式。这里有很多关于工厂模式与依赖注入的主题,但答案对我来说并不总是有意义

答案倾向于表明DI更现代或更灵活,或者工厂模式仍然有其地位,它只是用于不同的情况。或者甚至两者都不是互斥的,可以同时实现。无论采用哪种方式,DI通常都更加灵活。如果要进行更改,则需要对factory模式做更多的工作。我想这取决于你想做什么样的改变,但对于典型的情况,我认为恰恰相反

假设我正在寻找打电话的解决方案。我们可以测试不同的电话系统,并在这些电话系统中测试不同的API。现在让我们假设手机功能集成在几个不同的项目和模块中。如果我们想切换到一个不同的API或一个新的带有DI的电话系统,我们必须找到每个使用电话接口的项目,并用不同的对象实例化它。因此,我必须找到所有使用该接口的项目,并在每个项目中至少更改一行代码。但是,如果我使用工厂,我可以更改获取实例的方法来获取新类的实例。每个项目一行

简而言之,对于DI,每次使用新接口时都必须更新每个项目,但是对于工厂,只需要更改一种方法。此外,如果我想要一个特定项目的不同实例,我可以使用一个可选参数。比如“GetPhoneApi(“StarfaceTest”)”


在所有的讨论中,我从来没有把这看作是一种优势,这让我怀疑我是否遗漏了什么?那么到底是什么让DI更灵活呢?

这是否回答了您的问题?在工厂案例中更改实现只需要修改工厂本身,是的。但是,应用程序如何依赖于上述工厂知道如何使用新版本?魔术不,您必须显式地更新它们才能使用该版本。所以它要么在每个项目中更改一行代码,要么在每个项目中更新一个NuGet包。。。这真是太多了。
我一直在研究一个遗留系统,我们想切断电源线并使一切现代化。
当你说“切断电源线”时,你是指大爆炸式的重写,还是指渐进式的进化?@IanKemp起初我想说不,但后来我读到了一个关于手工DI和工厂模式一样是一种返工的回答。那么这就是答案吗?如果实现发生变化,那么手动DI实际上至少会有同样多的工作量?但是谁来决定在自动DI中使用什么实现呢?自动DI不是更像工厂和DI的组合吗?因为有一些组件可以选择实际注入的对象?如果开发人员考虑得不够深入,是的。从“为同一接口注册DI映射->在20个不同项目中实现”到“为同一接口注册DI映射->在单个项目中实现,并使所有20个项目都引用该项目”,这是一个相对简单的步骤。