猿问
回到首页
个人中心
反馈问题
注册登录
下载APP
首页
课程
实战
体系课
手记
专栏
慕课教程
什么是依赖注入?
什么是依赖注入?
什么是依赖注入以及何时/为什么应该或不应该使用它?
慕容森
浏览 2414
回答 5
5回答
函数式编程
到目前为止,我发现的最佳定义是James Shore:对于5美分的概念,“依赖注入”是一个25美元的术语。[...]依赖注入意味着为对象提供其实例变量。[...]。目前由Martin Fowler的一篇文章,可能证明是有用的,太。依赖注入基本上是提供对象所需的对象(其依赖关系),而不是让它自己构造它们。这是一种非常有用的测试技术,因为它允许模拟或删除依赖项。可以通过多种方式(例如构造函数注入或setter注入)将依赖项注入到对象中。甚至可以使用专门的依赖注入框架(例如Spring)来做到这一点,但它们当然不是必需的。您不需要这些框架具有依赖注入。显式地实例化和传递对象(依赖关系)与框架注入一样好。
0
0
0
慕田峪7331174
依赖注入是一种实践,其中对象的设计方式是从其他代码段接收对象的实例,而不是在内部构造它们。这意味着可以替换实现对象所需的接口的任何对象而无需更改代码,这简化了测试并改善了解耦。例如,考虑以下条款:public class PersonService { public void addManager( Person employee, Person newManager ) { ... } public void removeManager( Person employee, Person oldManager ) { ... } public Group getGroupByManager( Person manager ) { ... }}public class GroupMembershipService() { public void addPersonToGroup( Person person, Group group ) { ... } public void removePersonFromGroup( Person person, Group group ) { ... }}在这个例子中,执行PersonService::addManager并且PersonService::removeManager需要一个实例GroupMembershipService才能完成它的工作。如果没有依赖注入,传统的方法是GroupMembershipService在构造函数中实例化一个new ,PersonService并在两个函数中使用该实例属性。但是,如果构造函数GroupMembershipService有多个需要的东西,或者更糟糕的是,有一些初始化的“setter”需要调用GroupMembershipService,代码增长得相当快,PersonService现在不仅取决于GroupMembershipService而且还取决于其他所有东西。GroupMembershipService依赖于取决于。此外,链接到GroupMembershipService硬编码,PersonService这意味着你不能“假装”aGroupMembershipService 用于测试目的,或在应用程序的不同部分使用策略模式。使用依赖注入,而不是实例化GroupMembershipService你的内部PersonService,你要么将它传递给PersonService构造函数,要么添加一个Property(getter和setter)来设置它的本地实例。这意味着你PersonService不再需要担心如何创建一个GroupMembershipService,它只接受它给出的那些,并与它们一起工作。这也意味着任何作为接口的子类GroupMembershipService或实现GroupMembershipService接口的东西都可以“注入” PersonService,并且PersonService不需要知道变化。
0
0
0
神不在的星期二
接受的答案是一个很好的答案 - 但我想补充一点,DI非常类似于代码中经典的避免硬编码常量。当您使用某个常量(如数据库名称)时,您可以快速将其从代码内部移动到某个配置文件,并将包含该值的变量传递到需要它的位置。这样做的原因是这些常量通常比其余代码更频繁地更改。例如,如果您想测试测试数据库中的代码。DI在面向对象编程领域类似于此。那里的值而不是常量文字是整个对象 - 但是将类代码从类代码中创建出来的代码的原因是相似的 - 对象的更改频率比使用它们的代码更频繁。需要进行此类更改的一个重要案例是测试。
0
0
0
打开App,查看更多内容
随时随地看视频
慕课网APP
相关分类
算法与数据结构
数据结构中,与所使用的计算机无关的数据是什么?
1 回答
学完C语言之后是先学数据结构还是先学JAVA好呢?
1 回答
自然语言处理
自然语言处理与机器翻译以后的工作方向有哪些?
1 回答
做文本挖掘是否需要了解自然语言处理?
1 回答
设计模式
关于qt编程问题?
1 回答
请问视觉设计师如何提升自身的能力?
1 回答
继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续