已经发布了几个关于依赖注入的具体问题的问题,例如何时使用它以及它有哪些框架.然而,
什么是依赖注入以及何时/为什么应该或不应该使用它?
language-agnostic design-patterns dependency-injection terminology
框架和库有什么区别?
我一直认为库是一组对象和函数,专注于解决特定问题或应用程序开发的特定领域(即数据库访问); 另一方面,框架是一个以特定方法(即MVC)为中心的图书馆集合,涵盖了应用程序开发的所有领域.
引用依赖注入的大多数示例,我们也可以使用工厂模式解决.看起来在使用/设计时,依赖注入和工厂之间的差异是模糊的还是薄的.
一旦有人告诉我你如何使用它会有所作为!
我曾经使用StructureMap一个DI容器来解决问题,后来我重新设计它以使用一个简单的工厂并删除了对StructureMap的引用.
任何人都可以告诉我他们之间的区别是什么,在哪里使用什么,这里最好的做法是什么?
我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到的东西.
从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是从客户端隐藏实现,因为他们将看到通用产品.我的第一个问题是抽象工厂.它的作用是允许您创建具体对象的族(可能取决于您使用的特定工厂)而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?
我的最后两个问题是关于我在很多地方看到过的单一引言,我无法完全理解:
两者之间的一个区别是,使用抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化.
我的理解是工厂方法模式有一个Creator接口,它将使ConcreteCreator负责知道要实例化的ConcreteProduct.这是通过使用继承来处理对象实例化的意思吗?
现在关于那个引用,抽象工厂模式究竟是如何通过合成将对象实例化的责任委托给另一个对象?这是什么意思?看起来抽象工厂模式也使用继承来完成构建过程,但是我仍然在学习这些模式.
任何帮助,尤其是最后一个问题,将不胜感激.
design-patterns factory-method factory-pattern abstract-factory
最近我读过Mark Seemann关于Service Locator反模式的文章.
作者指出ServiceLocator为反模式的两个主要原因:
API使用问题(我完全可以使用)
当类使用服务定位器时,很难看到它的依赖关系,因为在大多数情况下,类只有一个PARAMETERLESS构造函数.与ServiceLocator相比,DI方法通过构造函数的参数显式地暴露依赖关系,因此在IntelliSense中很容易看到依赖关系.
维护问题(让我感到困惑)
请考虑以下示例
我们有一个使用服务定位器方法的类'MyType':
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们要为类'MyType'添加另一个依赖项
public class MyType
{
public void MyMethod()
{
var dep1 = Locator.Resolve<IDep1>();
dep1.DoSomething();
// new dependency
var dep2 = Locator.Resolve<IDep2>();
dep2.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我的误解开始的地方.作者说:
要判断你是否引入了一个重大改变,要变得更加困难.您需要了解使用Service Locator的整个应用程序,并且编译器不会帮助您.
但是等一下,如果我们使用DI方法,我们将在构造函数中引入与另一个参数的依赖关系(在构造函数注入的情况下).问题仍然存在.如果我们忘记设置ServiceLocator,那么我们可能忘记在IoC容器中添加新的映射,并且DI方法将具有相同的运行时问题.
此外,作者还提到了单元测试的难点.但是,我们不会有DI方法的问题吗?我们不需要更新所有实例化该类的测试吗?我们将更新它们以传递一个新的模拟依赖项,以使我们的测试可编译.我没有看到更新和时间花费带来任何好处.
我不是想捍卫Service Locator方法.但这种误解让我觉得我失去了一些非常重要的东西.有人可以消除我的怀疑吗?
更新(摘要):
我的问题"服务定位器是反模式"的答案实际上取决于具体情况.我绝对不会建议你从工具列表中删除它.当您开始处理遗留代码时,它可能会变得非常方便.如果你很幸运能够处于项目的最初阶段,那么DI方法可能是更好的选择,因为它比Service Locator有一些优势.
以下是主要的不同之处,这些差异使我不相信我的新项目使用Service Locator:
有关详细信息,请阅读下面给出的优秀答案.
design-patterns dependency-injection anti-patterns service-locator
乍一看,服务定位器模式与我的抽象工厂模式看起来相同.它们似乎都具有相同的用途(您查询它们以接收抽象服务的实例),并且当我阅读有关依赖注入时它们都被提及.
但是,我已经看到服务定位器模式被描述为一个糟糕的想法,但在至少一个主要的依赖注入框架中看到了对抽象工厂模式的直接支持.
如果它们不相同,有什么区别?
IoC和DI概念对我来说非常混乱,所以我阅读了很多观点和不同人的帖子,最后得出结论.据我了解这些主题是......
控制反转是java中用于制作松散耦合且更易于维护的应用程序的技术,并且依赖注入是实现该概念(技术)的方式之一.
控件容器的反转在运行时从java类注入依赖关系以使松散耦合的应用程序.
这是真的 ?如果我错了,请纠正我
我为这个问题的主观性而道歉,但我有点卡住了,我希望以前能够处理这个问题的人提供一些指导和建议:
我有(成为什么)一个用C#2.0编写的非常大的RESTful API项目,我的一些类变得非常可怕.我的主要API类就是一个例子 - 有几十个成员和方法(可能接近数百个).你可以想象,它变成了一个小噩梦,不仅仅是维护这段代码,甚至只是导航代码已经成为一件苦差事.
我是SOLID原则的新手,我是设计模式的忠实粉丝(但我仍处于可以实现它们的那个阶段,但还不足以知道何时使用它们 - 在不太明显的情况下) .
我需要打破我的班级规模,但我不知道如何最好地去做.我的StackOverflower伙伴能否建议他们采用现有的代码单块并将其缩小到适当大小?
我已经阅读了许多解释IoC和DI之间差异的线程,虽然许多解释相互矛盾,但我认为它们仍然帮助我理解了它们之间的区别.
所以在这里我想问一下我的理解是否正确,并且发布了有助于我的摘录(虽然其中一些相互矛盾).
我知道在这个问题上已经有很多线程,但我希望这个线程不会被关闭,因为我不认为提到的线程中的任何OP也显示所有相关的帖子(来自各种线程)他们终于明白了.
无论如何,这是我理解的方式(如果可能,请单独解答/回答每个问题):
a)当我们在框架层面应用DIP原则时,我们使用术语IoC?在框架层面实施DIP的机制之一是DI?
b)当我们在较低级别/非框架级别实施DIP(使用DI)时,术语IoC不适用,在这种情况下,我们简称为DI?
c)DI通过将实际创建和选择依赖关系的控制权传递给第三方来帮助我们实现DIP,第三方对所涉及的其他2个中立方是中立的?
d)当在框架级(IoC)应用DIP(使用DI)时,三种类型的控制被反转:
界面的控制.现在,高级模块正在控制低级模块需要遵循的接口,而不是相反
控制流量.- >现在框架代码(而不是用户/业务代码)控制程序的流程(换句话说 - 它们(即框架)调用你(即业务代码) )
依赖创建的控制.这种反转将实际创建和选择依赖关系的控制权传递给第三方,该第三方对所涉及的其他2个中立方是中立的.
e)当在非框架级别应用DIP(使用DI)时,两种类型的控制被反转:
界面的控制.现在,高级模块正在控制低级模块需要遵循的接口,而不是相反
依赖创建的控制.这种反转将实际创建和选择依赖关系的控制权传递给第三方,该第三方对所涉及的其他2个中立方是中立的.
?
以下摘录有助于:
控制反转是通用术语.依赖注入是一种特定类型的IoC
...
控制反转是指框架/基础架构调用应用程序代码,而不是相反
...
可以在不做IoC的情况下进行DI.如果你将一个ConcesoleStringWriter注入到HelloWorld中,我并不认为这是IoC,因为没有"框架"或"基础架构".
如果您接受Fowler的定义,那么控制反转是一个比DI更广泛的术语,涵盖了插入框架的所有框架使用,但框架仍处于控制之中.依赖注入是IoC的一个专门化,它专门用于管理依赖关系.
域对象不应该有任何依赖项,因此也没有依赖项注入。但是,当从域对象内调度域事件时,我可能希望使用集中的EventDispatcher
. 我怎么能抓住一个?
我不想将事件列表返回给调用者,因为我希望它们保持不透明并保证它们的调度。这些事件应该只被需要强制执行最终一致约束的其他域对象和服务使用。
我正在研究设计模式,有一刻让自己想到了一个想法,即工厂和抽象工厂等大多数创建模式在依赖注入环境的范围内并不是那么有用,在这种环境中我们通常不使用new
关键字创建对象,而是“从某种上下文中注入”它们。我也明白我很可能是错的,我需要一个很好的解释来把事情弄清楚。
oop ×4
java ×2
terminology ×2
aggregation ×1
associations ×1
c# ×1
composition ×1
frameworks ×1
glossary ×1
libraries ×1
principles ×1
spring ×1
spring-boot ×1
uml ×1