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

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, 还是要看他们之间的依赖关系.

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏海说

类设计的SOLID原则

SOLID原则是面向对象范式的核心 单一职责原则(Single Responsible Principle, SRP):对于一个类,应该仅有一个引起它变化的原因...

22500
来自专栏安恒网络空间安全讲武堂

堆利用之double-free

38340
来自专栏Python中文社区

OpenStack中的RESTful API是如何实现的?

OpenStack作为一个开源的IaaS平台,各个组件和服务之间的消息传递都是通过RESTfulAPI和RPC传递,这里主要讲讲它是如何实现REST的。由于大家...

36980
来自专栏along的开发之旅

Java8移除永久代

最近看深入理解Java虚拟机, 在实战OutOfMemoryError的运行时常量池溢出时, 我的Intellij提示如下:

12610
来自专栏草根专栏

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

DIP 依赖反转原则 Dependency Inversion Principle 的定义如下: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象....

27850
来自专栏友弟技术工作室

MongoDB简易教程mongo简介及应用场景安装和使用mongodbPHP中操作mongo数据库python中操作mongo数据库

传统数据库中,我们要操作数据库数据都要书写大量的sql语句,而且在进行无规则数据的存储时,传统关系型数据库建表时对不同字段的处理也显得有些乏力,mongo应运而...

47760
来自专栏JavaEdge

线程安全与锁优化1 线程安全2 锁优化

34990
来自专栏Java成神之路

java分层架构概念

1.JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分?(下面所描述的service层就是biz)       首先这是现在...

29040
来自专栏QQ音乐技术团队的专栏

打通Android Gradle编译过程的任督二脉

本文主要是基于自己在工作当中的一些Android Gradle实践经验,对gradle相关知识做的一个简单总结和分享,希望对大家有帮助。 首先会讲Gradle大...

1.9K90
来自专栏草根专栏

用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS

本文所需的一些预备知识可以看这里: http://www.cnblogs.com/cgzl/p/9010978.html 和 http://www.cnblog...

17640

扫码关注云+社区

领取腾讯云代金券