前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >依赖倒置原则

依赖倒置原则

作者头像
宿春磊Charles
发布2022-03-29 09:31:18
4420
发布2022-03-29 09:31:18
举报
文章被收录于专栏:DotNet 致知

今天讲一下,Asp.NetCore开发中一个很重要的概念,依赖倒置原则。依赖倒置原则主要是解耦类和类之间的依赖,面向对象一个很重要的概念就是高内聚,低耦合,降低耦合,可以让类和类之间的影响最大化降低,简单点,就是修改一个类的代码,不会让别的类也无法运作。

依赖倒置就是开发中降低耦合的一个很好的方式,它通过IOC容器,将所有依赖关系都托管在IOC容器中,类需要什么,就给什么,这一过程,也叫做依赖注入(Dependency Injection)。

在了解依赖倒置之前,先讲一下里氏转换原则,子类继承父类,那么,原来适用于父类的场景,一定适用于子类,因为子类继承了父类的所有显式功能,父类能做的,子类也能做。这一原则就是定义这个理论的存在,子类可以直接替代父类,将父类全部转换为子类,程序的行为没有区别。

下面详细讲解一下,何为依赖倒置,举个例子,老板需要打印一份文档,如果自己去打印,老板就需要找打印机自行打印文件,这属于直接依赖打印机。反过来说,老板找秘书,分配打印任务叫秘书去做,老板只需要从秘书那里拿到文件,不必考虑秘书是如何打印的,这就是依赖倒置。

其实,分配任务的过程其实就是一种抽象,把行为抽象出来,毫不考虑如何打印等细节。在程序开发中,我们非常需要面向抽象,也就是说面向接口编程,因为接口就是类的抽象,一个类依赖接口,那么所有实现这个接口的类,都能被其所用。

依赖倒置就是类的秘书(IOC),它将类的依赖都托管给自己,类需要什么,就给什么,所以使用了依赖倒置原则的ASP.NetCore程序,在控制器中你很难看到new关键字,没有new实例,怎么使用类为我们服务呢,我们不需要知道,我们只需要将自己的依赖,放在构造函数中,相当于给IOC容器说明一下,在构造的时候,IOC就会自动new出实例。上面也讲到,这一过程叫做依赖注入,那依赖倒置和依赖注入有什么关系呢,其实依赖注入是依赖倒置的一个实现方式,也可以说,通过依赖注入,实现了依赖倒置原则。

下面通过代码,去看一下,在ASP.netCore程序中,如何配置和使用依赖注入

在StartUp里边,有一个管理中间件的类,还有一个管理依赖注入的类叫ConfigureServices微软自带了一套依赖注入的框架,通过这个类,就可以为IOC容器添加预定依赖,如果不添加,IOC找不到对应的依赖原型,就不能提供依赖注入。

代码语言:javascript
复制
  //这是三种配置依赖注入的方式
  //作用域范围
  services.AddScoped<IShoppingOperation, ShoppingOperation>();
  //瞬时模式
  services.AddTransient<IShoppingOperation, ShoppingOperation>();
  //单例模式
  services.AddSingleton<IShoppingOperation, ShoppingOperation>();

下面解析一下这三种区别,

作用域范围的依赖注入,在同一个作用域下,两处依赖某对象,IOC 容器会给分配相同的实例,也就是说,相当于两个实例引用同一个地址(拿开会举例子,作用域就是开会时共看一份会议说明)

瞬时模式,顾名思义,不论任何情况,需要一次就new一个新的出来(人手一份会议说明)

单例模式,程序的整个运行周期,只会new一次(每次会议都用一个会议说明,代代相传)

单单这样引用是不会考虑到抽象的,这三个方法都有对应用于抽象的泛型,也是上面代码示例的样子,<接口,实现接口的类>,在依赖注入时,我们只需写接口对象,IOC就会new一个实现接口类的实例对象

代码语言:javascript
复制
  private readonly IShoppingOperation _shoppingOperation;
  public HomeController(IShoppingOperation shoppingOperation)
  {
      _shoppingOperation = shoppingOperation;
  }

这样,就实现了面向抽象,我用接口对象,所有继承该接口的类,我都可以用,修改时只需修改startup中的依赖配置即可,一个文件看不出效果,不用抽象,直接改代码也不费劲,但是如果有100个文件呢,你会选择修改一次还是修改100次?

本节到此结束,笔力有限,不懂之处,可以留言...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档