依赖注入
动机
依赖注入主要是为了解决使用者对服务的具体实现的依赖,解除使用者对服务的具体实现的依赖.
基本思想
依赖注入通过一个单独的装配器来获取服务的具体实现,并将获取的实例配置给使用者.这样解除了使用者和服务的具体实现之间的依赖关系,使用者和服务之间通过接口的契约进行关联.一旦定义好接口,两者之间就是透明的.
实现方式
构造子注入:使用者类必须声明一个构造函数,其中包含所有需要注入的元素.PicoContainer容器推荐采用这种方式.
设置方法注入:使用者类提供一个设值方法,接受需要注入的元素作为参数.Spring容器推荐采用这种方式.
接口注入:服务组件必须提供一个接口,此接口只有一个方法,接受需要注入的服务组件接口作为参数,任何服务的使用者必须实现这个接口.装配器通过这些接口将使用者和服务关联起来.如Avalon就采用类似的方式.
服务定位器
基本思想
服务定位器的基本思想是有一个单独的服务器知道如何获取使用者需要的所有服务,使用者通过服务定位器类实例获取服务的具体实现,从而解除使用者和服务的依赖关系。但是和依赖注入不同的是使用者必须依赖定位服务器。
实现方式
静态服务定位器:将服务定位器实现成一个单例的注册表,此种简单的实现方式有一个问题就是,使用者必须依赖的整个服务定位器,虽然他只使用服务定位器的部分服务,可以通过针对这项服务提供一个简单独立的接口解决。
动态服务定位器:服务定位器通过映射保存服务信息,可以向他注册需要的服务,并在运行时决定需要使用的服务。这种方式具有很好的灵活性,但是使用者必须通过字符串关键字标识需要使用的服务。
通过依赖注入解除使用者对服务定位器类的依赖。
依赖注入还是服务定位器?
两者之间关键的区别是,使用服务定位器模式,使用者必须依赖于服务定位器,虽然服务定位器可以隐藏服务的具体实现,但是使用者还是必须首先知道服务定位器。然而使用依赖注入,组件和装配器之间没有依赖关系。因此选择的依据应该是对服务定位器的依赖是否会造成问题。
服务定位器模式把使用者对服务的依赖隐藏在内部,对外是透明的(采用依赖注入实现使用者对服务定位器的了解例外)。对于一个比较复杂的系统,如果需要了解组件之间的关系,是比较困难的,必须遍历代码使用服务定位器的组件。使用依赖注入可以通过构造子和设值方法了解组件之间的关系,或者通过装配器了解组件之间的关系。
依赖注入的优点是实现了关注点的分离,也就是将组件之间的关系分离出来,作为一个整体由装配器来负责。
构造子注入还是设值方法注入?
构造子注入和设值方法的选择折射出一个问题:我们应该在哪里填充对象的字段?通过构造子初始化的好处是可以明确地告诉如何创建一个合法的对象,另一个好处是可以隐藏任何不可变的字段(通过不提供设置方法),如果通过设值方法完成初始化,暴露出来的设置方法可能会由于误用而造成意料之外的问题。缺点是参数太多会造成构造子比较混乱,如果要传入字符串这样的简单类型,只能通过参数的位置来识别参数的含义,显然这会给使用者造成困扰。个人觉得应该优先采用构造子注入。
结论和思考
许多轻量级容器都使用了依赖注入模式组装应用程序所需要的服务。开发应用程序时,服务定位器模式更加直观。如果开发的组件需要发布给许多程序使用,采用依赖注入模式会是更好的选择。
如果采用依赖注入模式,应该首先考虑构造子注入的方式,特定情况下,采用设值方法注入的方式。
依赖注入和服务定位器模式的选择并不是最重要的,关键是如果需要把选择具体实现类的决策推迟到部署阶段,需要使用插入技术,分离服务的装配和应用程序内部对服务的使用。
分享到:
相关推荐
### C# 依赖注入 控制反转 #### 一、IoC(控制反转)简介 IoC,即"Inversion of Control"(控制反转),是软件工程领域的一个重要概念,特别是面向对象编程中的一个关键设计原则。从字面上理解,IoC指的是程序运行...
### 依赖注入那些事儿 #### 1. IGame游戏公司的故事 ##### 1.1 讨论会 IGame是一家专注于开发动作角色扮演游戏的游戏公司。这类游戏通常包含一个基础功能——打怪,即玩家通过攻击怪物来获得经验值、虚拟货币和...
依赖注入(Dependency Injection,简称DI)是一种设计模式,它在软件工程中被广泛应用于解耦组件,提高代码的可测试性和可维护性。在PHP世界里,依赖注入框架可以帮助开发者更方便地管理类之间的依赖关系,减少硬...
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...
在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种重要的设计模式,它使得对象之间的耦合度降低,提高了代码的可测试性和可维护性。本文将深入探讨Spring中的依赖注入实现方式,以及如何通过样例文件...
依赖注入(Dependency Injection, DI)是一种设计模式,它有助于降低代码耦合度,提高可测试性和可维护性。本篇文章将深入探讨如何使用EF Core结合依赖注入来实现数据库的基本操作。 1. **EF Core 简介** EF Core ...
"IoC 依赖注入 技术总结" IoC 依赖注入技术是软件设计中的一种重要技术,旨在解决软件系统中的耦合问题。该技术的核心思想是将被调用构件实例化,并注入到调用构件之中,以实现软件系统的高内聚、低耦合。IoC 依赖...
Spring依赖注入是Spring框架的核心特性之一,它极大地简化了Java应用程序的开发,使得对象之间的依赖关系得以解耦,提高了代码的可测试性和可维护性。本文将深入探讨Spring依赖注入的底层实现机制。 首先,我们要...
较为框架式的演示了DI服务依赖注入 适用于熟悉C#中的继承,基本的Core命令使用等. 该示例演示了以服务器集群为背景的各种业务的依赖注入. 示例来自于B站杨中科老师的.NET Core(6.0)教学.
这个“Angular6依赖注入Demo”显然提供了关于如何在Angular6应用中使用依赖注入的实际示例,同时也包含了懒加载(Lazy Loading)的实现,这有助于提高应用程序的性能,因为只有在用户实际需要时才会加载特定模块。...
在IT行业中,依赖注入(Dependency Injection,简称DI)是一种设计模式,它有助于提高代码的可测试性、可维护性和灵活性。PHP作为一个广泛用于Web开发的动态类型语言,也有许多优秀的依赖注入容器库来支持这一模式。...
### Spring IoC与注解依赖注入详解 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一个开源项目,最初是为了解决企业级应用开发中的复杂性问题而诞生的。Spring框架的核心特性包括IoC(Inversion of ...
【Spring依赖注入详解】 在Java开发中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)功能而闻名。依赖注入是一种设计模式,它允许我们解耦组件,使我们的应用程序更加灵活,易于测试和维护。本篇...
在编程领域,反射和依赖注入是两种非常重要的概念,它们都是高级编程技术,可以极大地提升代码的灵活性和可维护性。下面将详细讲解这两个概念及其在实际应用中的DEMO示例。 **反射** 反射是Java(以及其他一些面向...
在深入探讨Spring框架中基于注解(Annotation)的依赖注入(Dependency Injection,简称DI)实现之前,我们首先需要理解几个核心概念:Spring框架、依赖注入、以及注解本身。 ### Spring框架简介 Spring框架是一个...
依赖注入的核心思想是,一个对象不应该负责创建或查找它所依赖的对象,而是应该由外部源(如容器或框架)来提供这些依赖。这样可以减少类之间的耦合,使得代码更加灵活和易于测试。在PHP中,我们通常通过构造函数、...
### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...
C++依赖注入是一种设计模式,它对于简化软件设计、控制依赖关系、降低耦合度、提高代码的内聚度以及方便进行单元测试具有重要作用。依赖注入的核心思想是将依赖对象的创建和使用分离,通过第三方(例如容器)在对象...
【标题】"第三章 Spring4 依赖注入"深入解析 在Spring框架中,依赖注入(Dependency Injection,简称DI)是一种核心的设计模式,它允许我们创建松耦合的代码,提高软件的可测试性和可维护性。Spring4版本进一步优化...