DIP 依赖反转原则 Dependency Inversion Principle 的定义如下:

高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象.

假设Controller依赖于Repository的实例/实现, 而不是interface:

这个例子里面Controller是高级别模块, Repository是低级别模块.

但是根据定义: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 那么如何解决这个问题呢?

那就是 从Repository中提炼出一个interface, 叫做IRepository, 它就是个抽象:

这样一来, Controller依赖于IRepository, 所以高级别模块不依赖于低级别模块, 他们现在都依赖于抽象了.

那么这么做有什么好处? 为什么要使用DIP原则?

答案就是: 减少变化带来的影响.

看第一张图:

就从一个方面来说, 如果Repository被重新编译了, 那么Controller肯定需要重新编译, 也就是所有依赖于Repository的类都会被重新编译.

而使用DIP原则之后:

我们可以在Repository里面做出很多更改, 但是这些变化都不会影响到Controller, 因为Controller并不是依赖于这个实现.

只要IRepository这个interface或者叫Contract合约不发生变化, Controller就不会被影响到. 这也就可能会较少对整个项目的影响.

Interface 代表的是 "是什么样的", 而实现代表的是 "如何去实现".

Interface一旦完成后是很少改变的.

针对使用Repository+UnitOfWork模式的asp.net core的项目结构, 少许码友可能会有一点错误的理解, 可能会把asp.net core项目的结构这样划分:

这样一来, 其实就是这样的:

高级别的包/模块依赖于低级别的包/模块.

也就违反了DIP原则, 所以如果想按原则执行, 就需要引进一个新的模块:

把所有的抽象相关的类都放在Core里面.

这样就满足了DIP原则.

asp.net core的项目结构大致应该是这个思路:

由于Models是整个项目的核心内容, 所以也放在了Core里面.

当然也可以分成多个项目去实现DIP, 但是不一定按多个项目分开了就一定实现了DIP, 还是要看他们之间的依赖关系.

转载于:https://www.cnblogs.com/cgzl/p/8581318.html

依赖反转原则DIP 与使用了Repository模式的asp.net core项目结构相关推荐

  1. 依赖反转原则(DIP)

    依赖反转原则.依赖反转原则的英文翻译是 Dependency Inversion Principle,缩写为 DIP.中文翻译有时候也叫依赖倒置原则. 为了追本溯源,我先给出这条原则最原汁原味的英文描 ...

  2. DIP依赖反转原则——实现松耦合的设计

    在<IoC控制反转设计原则--实现松耦合>我们将控制工作委派给其他类来完成,向松耦合设计又迈进了一步.但是我们类仍然依赖着具体的类,所以我们可以使用DIP(依赖反转原则)来进一步获得松耦合 ...

  3. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做" ...

  4. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  5. 【简译】关于依赖反转原则、控制反转和依赖注入的抽象的初学者指南

    原文在此. ======================================分割线==================================== 介绍 文章以介绍依赖反转原则开始 ...

  6. 观察者模式与依赖反转原则

    最近写了一个"休息吧,程序员"的小工具,用到了观察者模式,感觉自己的理解还不够深入,借此机会稍微深入学习一下. 项目介绍:提醒程序员不要过度工作的一个脚本,暖心程序跟你道晚安,使用 ...

  7. 地表最强22个互联网定律和原则:炒作周期、依赖反转原则、Spotify模型……

    ▲ 点击上方"老于的笔记"关注公众号 回复1,免费获取B端运营地图 正文来了 精选了7个原则和15个定律,互联网人公认的牛出天际! 产品经理照着做策划,保证怼开发.怼测试.怼老板, ...

  8. 吐槽 依赖倒置原则/DIP

    返回目录   1.2.5抛弃依赖倒置原则(正文) ,本文专门吐槽依赖倒置原则(Dependency Inversion Principle.DIP). 1.Robert C. Martin的那篇DIP ...

  9. 依赖反转(倒置)原则(Dependency inversion principle,DIP)

    在软件设计.编码过程中有几个基本原则即SOLID原则,学习理解能够帮忙我们写出更健壮的代码.SOLID是五个基本原则的首字母.这五个原则如下: Single responsibility Open–c ...

最新文章

  1. Python将所有的英文单词首字母变成大写
  2. python分数运算使用Fraction模块
  3. Mysql报错Fatal error: Can#39;t open and lock privilege tables: Table #39;mysql.host#39; doesn#39;t...
  4. window7/10 安装Tomcat
  5. Python面向对象:isinstance和issubclass
  6. 怎么用c语言表示大整数的四则运算,用c语言编写大整数的四则运算,求大神
  7. 设置一个DIV固定在底部,并且左右固定,垂直居中
  8. libusb开发:bulk/interrupt数据传输、hotplug热插拔
  9. web前端实战系列[1]——三列布局
  10. ELK套件FileBeat部署
  11. Thinkphp开发时关闭缓存的方法
  12. ckeditor+代码高亮
  13. Atitit Server Side Include  ssi服务端包含规范 csi  esi
  14. 通俗易懂的极限学习机(Extreme Learning Machine)
  15. 计算机安装系统后鼠标无法使用,电脑重装系统后鼠标键盘不能用怎么办,鼠标键盘不能用解决方法...
  16. 面试/一些思维发散的题(带参考回答)每日一份题
  17. c语言编写cad建筑画图程序,CAD建筑平面图绘图步骤试题.doc
  18. 中山香山杯 misc write up
  19. 我心中的linux,和我如何用GNU linux工作!【强帖,精彩,真精彩】
  20. Firebug网络面板里的两条竖线表示什么?

热门文章

  1. Intellij idea 自动生成serialVersionUID
  2. 光学字符识别OCR-6 光学识别
  3. Unity中uGUI的控件事件穿透逻辑
  4. 并发下,使用redis防止数据重复插入(数据库未对表字段设置唯一情况下)
  5. 不同林间域账号密码迁移
  6. OBJECT_MODE
  7. mysql 标记_Mysql操作基础,标记一上
  8. SSM之Mybatis框架初步
  9. pop!_os_Pop!幕后花絮_OS Linux
  10. 开源软件使用_亲爱的父母:让您的孩子使用开源软件