首页 > 其他分享 >第69篇 DI依赖注入

第69篇 DI依赖注入

时间:2024-12-07 12:10:05浏览次数:2  
标签:依赖 调用者 斧子 DI 自动售货机 69 注入

1.相关基本概念

1.1 类和对象

类是一个静态的概念,类本身不携带任何数据。当没有为类创建任何对象时,类本身不存在于内存空间中。

new 实例化的过程
声明引用;
使用new关键字创建类的对象并对其初始化;(分配内存空间)
将引用指向类的对象。

解除依赖的思想是如何产生的?
(1)原始社会里,没有社会分工。须要斧子的人(调用者)仅仅能自己去磨一把斧子(被调用者)。相应的情形为:软件程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完毕,而在工厂里被生产出来,此时须要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。相应软件程序的简单工厂的设计模式。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:须要斧子。斧子就自然出如今他面前。依赖注入。

1.2 控制反转 IoC (Inversion of Control)

23种设计模式6个基本原则

  • 1.单一职责(一个方法或一个类只做一件事,为了模块内高内聚)
  • 2.迪米特法则(也叫最少知道原则,为了模块间低耦合)
  • 3.里氏替换(就是继承原则,子类可以无缝替代父类。很好的符合了开闭原则)
  • 4.依赖倒置(类之间的依赖通过接口实现,低耦合的同时对扩展开放)
  • 5.接口隔离(即把单个复杂接口拆分为多个独立接口,与上条共同实现面向接口编程)
  • 6.合成复用原则(即尽量使用合成/聚合的方式,而不是使用继承。主要为了防止继承滥用而导致的类之间耦合严重。记住只有符合继承原则时才用继承)

高级模块不应该依赖于低级模块;两者都应该取决于抽象

什么是控制反转
你把程序里的一个写死的变量改成从配置文件里读取也是一种控制反转(由程序控制反转为由框架控制),你把这个配置改成用户UI界面的一个输入文本框由用户输入也是一种控制反转(由框架控制反转为由用户自己控制)。

  • 是一种设计原则,最早由Martin Fowler提出,因为其理论提出时间和成熟时间相对较晚,所以并没有被包含在GoF的《设计模式》中。
  • 对依赖的控制,从自己,转到自己的调用者上。

1.3 依赖注入 DI(Dependency Injection)

DI 和 IoC的关系

  • 实现IoC的其中一种设计方法,
  • 依赖的对象注入到调用者,你不应该自己创建它,而是应该通过构造函数由你的调用者给你——容器

常用的框架有哪些

  • 微软 core 自带的 DI
  • Autofac:貌似目前net下用的最多吧
  • Ninject:目前好像没多少人用了
  • Unity:也是较为常见

三种注入方法

  • 构造函数注入(遵循显式依赖原则)

      public class StudentService : IStudentService
      	{
      		private readonly IStudentRepository _studentRepository;
      		/// 
      		/// 构造注入
      		/// 
      		/// <param name="studentRepository"></param>
      		public StudentService(IStudentRepository studentRepository)
      		{
      			_studentRepository = studentRepository;
      		}
      	}
    
  • 属性注入

      public class TeacherService : ITeacherService
      {
      	
      	
      	
      	public ITeacherRepository TeacherRepository { get; set; }
      	public string GetTeacherName(long id)
      	{
      		return TeacherRepository?.Get(111).Name;
      	}
      }
    
      要使用这种属性注入,在注册该属性所属类的时候,需要使用PropertiesAutowired()方法额外标注,如下:
      builder.RegisterType<TeacherService().PropertiesAutowired();
    
  • 方法注入

三种生命周期,注意要保持一致

  • AddTransient
    每次注入或请求时都会创建转瞬即逝的服务.

  • AddScoped
    是按范围创建的,在Web应用程序中,每个Web请求都会创建一个新的独立服务范围.

  • AddSingleton
    每个DI容器创建一个单例服务,这通常意味着它们在每个应用程序只创建一次,然后用于整个应用程序生命周期.

举例,场景说明(自动售货机):

  • 容器是一个自动售货机,组件是放在里面的在售商品,服务是商品的出售名称。
  • 把商品(项目里的具象对象)放入自动售货机(容器)上架的过程叫注册;
  • 注册的时候会给商品贴上标签,标注该商品的名称,这个名称就叫服务;
  • 我们还可以标注这个商品的适用人群和过期时间等(生命周期作用域);
  • 把这个包装后的商品放入自动售货机后,它就变成了在售商品(组件)。
  • 当有顾客需要某个商品时,他只要对着售货机报一个商品名(服务名),自动售货机找到对应商品,抛出给客户,这个抛给你的过程,就叫做注入你;
  • 而且这个售货机比较智能,抛出前还可以先判断商品是不是过期了,该不该抛给你。

2.为什么要使用依赖注入

image

3.依赖注入的步骤

image

4.DI其他方面使用———— AOP

标签:依赖,调用者,斧子,DI,自动售货机,69,注入
From: https://www.cnblogs.com/chenshibao/p/18589552

相关文章

  • Stable Diffusion核心网络结构——VAE
    本文详细介绍SD模型的三部件之一——VAE,阐述VAE在SD模型中的作用和完整的架构。目录传统VAEStableDiffusion核心网络结构SD模型整体架构初识VAE模型【1】StableDiffusion中VAE的核心作用【2】StableDiffusion中VAE的高阶作用【3】StableDiffusion中VAE模型的完......
  • 解题报告-论对“依赖背包”的新理解
    解题报告-论对“依赖背包”的新理解依赖背包的依赖关系组成一棵树。那么为什么不能按照树形\(\text{DP}\)的方式来思考它呢?这是个模板题。既然我们说了按照树形\(\text{DP}\)的方式思考它,就要打破常规的\(\text{DP}\)思维。树形\(\text{DP}\)的特点之一就是考虑每个子......
  • EasyCoding敏捷开发平台-需求排序和规划
    已创建需求,需求状态为新建或进行中状态,且需求所属的团队或领域信息,与左上角的团队或领域一致。需求状态为完成或取消(作废)状态,且非本团队或领域的需求不在所有工作项列表展示。操作步骤1.登录EasyCoding控制台。2.选中一个工作区,并进入项目工作区。3.点“工作项->Backlog”,......
  • EasyCoding敏捷开发平台-管理需求
    新建需求为产品和项目提交需求。约束与限制当前工作区已配置了“需求”工作项类型,且工作项类型是允许用户手工创建。若工作项类型不允许手工创建,则不可新建。操作步骤1.登录EasyCoding控制台2.选中一个工作区,并进入项目工作区3.点“工作项->所有工作项”,进入所有工作项......
  • 说说你对Media Source Extensions(MSE)的理解,它解决了什么问题呢?
    MediaSourceExtensions(MSE)是一个强大的HTML5API,它允许JavaScript动态地构建媒体流。它解决了在Web上播放视频和音频时的一些关键问题,特别是对于涉及自适应比特率流媒体和更精细控制媒体播放的情况。MSE主要解决以下问题:自适应比特率流媒体(ABR):在传统的视频......
  • Redis教程【二】
    Redis由入门到精通4.Redis配置文件4.1远程连接配置修改redis.conf配置文件bind127.0.0.1-::1表示只能接受本机的访问,要通过其他电脑远程进行连接就应该注释protected-modeyes表示开启保护模式,只能通过本机访问,远程不能访问,改为no就可以进行远程访问了protecte......
  • 电动汽车制造执行系统(MES)软件:GE Digital EV二次开发_(10).系统集成:MES与其他制造系统
    系统集成:MES与其他制造系统的接口开发在电动汽车制造过程中,制造执行系统(MES)作为生产管理的核心系统,需要与多种其他制造系统进行高效的数据交换和业务协同。这些系统包括但不限于生产计划系统(APS)、企业资源规划系统(ERP)、供应链管理系统(SCM)、质量管理系统(QMS)以及自动化设备(......
  • 电动汽车制造执行系统(MES)软件:GE Digital EV二次开发_(19).部署与运维:MES系统上线后的
    部署与运维:MES系统上线后的管理与维护在电动汽车制造执行系统(MES)软件上线后,管理和维护是确保系统稳定运行、高效生产的关键环节。这一节将详细探讨MES系统上线后的管理与维护,包括系统监控、故障排除、性能优化、数据备份与恢复、系统升级和安全管理等方面的内容。系统监......
  • 电动汽车制造执行系统(MES)软件:GE Digital EV二次开发_(20).持续改进:MES系统在电动汽车
    持续改进:MES系统在电动汽车制造中的迭代升级在电动汽车制造过程中,制造执行系统(MES)的持续改进是确保生产效率、质量控制和数据分析的关键。本节将详细介绍MES系统在电动汽车制造中的迭代升级原理和具体实践,包括需求分析、功能优化、系统集成和测试验证等关键步骤。1.需求......
  • Procrastination is not lazy, not habbit, not distraction, but as a self-protec
    Perfectionismcanveryeasilyleadtoprocrastination.Whenyouspend10hoursstudyingjusttograsp2hours'worthofmaterial,youmaystillfeellikeyoudon'tfullyunderstandthecontent.Yoursubconsciousthenestimatesthisasa"st......