依赖倒置在.NET中

高层模块不应该依赖底层模块,两都都应该依赖抽象

一个三层的Demo

/// <summary>
/// 人员实体类
/// </summary>
class Person
{public int ID { get; set; }public string Name { get; set; }public bool Sex { get; set; }
}
/// <summary>
/// 表示层
/// </summary>
class UI
{public void Main(){ShowPerson();}    public static void ShowPerson(){Console.WriteLine("输入要查询的人员ID");var id = int.Parse(Console.ReadLine());var bll = new BLL();var person = bll.FindPerson(id);Console.WriteLine($"ID:{person.ID},Name:{person.Name},Sex:{(person.Sex ? "男" : "女")}");}
}
/// <summary>
/// 业务逻辑层
/// </summary>
class BLL
{public Person FindPerson(int id){var dal = new DAL();return dal.QueryPersonByID(id);}
}
/// <summary>
/// 数据访问层
/// </summary>
class DAL
{public Person QueryPersonByID(int id){return new Person { ID = id, Name = "张三丰收", Sex = true };}
}

高层模块指的是调用方:

UI类ShowPerson方法中bll.FindPerson

BLL类FindPerson方法中dal.QueryPersonByID

底层模块指的是实现模块:

BLL类FindPerson()方法

DAL类QueryPersonByID()方法

这是直接用法,为了降低耦合,响应需求变化,要把这种强依赖切降低,遵照“依赖倒置”,增加抽象层,用抽像层隔离高层和底层模块,本代码段中用一个ObjectHub来集中管理实例化过程,如下代码:

 #region 实体类/// <summary>/// 人员实体类/// </summary>class Person{public int ID { get; set; }public string Name { get; set; }public bool Sex { get; set; }}#endregion#region 对象仓库/// <summary>/// 对象仓库/// </summary>class ObjectHub{public static Dictionary<string, object> Container { get; private set; }static ObjectHub(){//通过这里来解耦Container = new Dictionary<string, object>{{ nameof(IDAL),  new DAL() },{ nameof(IBLL),new BLL() }};}}#endregion#region 表示/// <summary>/// 表示层/// </summary>class UI{static void Main(string[] args){var ui = new UI();ui.ShowPerson();}public void ShowPerson(){//依赖业务逻辑层接口var bll = ObjectHub.Container[nameof(IBLL)] as IBLL;Console.WriteLine("输入要查询的人员ID");var id = int.Parse(Console.ReadLine());var person = bll.FindPerson(id);Console.WriteLine($"ID:{person.ID},Name:{person.Name},Sex:{(person.Sex ? "男" : "女")}");}}#endregion#region 业务逻辑/// <summary>/// 业务逻辑层接口/// </summary>interface IBLL{Person FindPerson(int id);}/// <summary>/// 业务逻辑层/// </summary>class BLL : IBLL{public Person FindPerson(int id){//依赖业务逻辑层接口var dal = ObjectHub.Container[nameof(IDAL)] as IDAL;return dal.QueryPersonByID(id);}}#endregion#region 数据访问/// <summary>/// 数据访问层接口/// </summary>interface IDAL{Person QueryPersonByID(int id);}/// <summary>/// 数据访问层/// </summary>class DAL : IDAL{public Person QueryPersonByID(int id){return new Person { ID = id, Name = "张三丰收", Sex = true };}}#endregion

原来是高层模块依赖底层模块,现在依赖倒置,怎么倒置了呢?个人理解:高层和底层之间出现了一个抽像,高层依赖抽象,按理抽象依赖底层,但这里恰恰是底层和也依赖抽象,打破了一个依赖链,形成一个倒置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Session?

首先解释一下什么是Session,如果你不知道的话。当一个访问者来到你的网站的时候一个Session就开始了,当他离开的时候Session 就结束了。本质是来说,cookie是和浏览器有关系,而Session变量就可以存一些资源变量在服务器上面。PHP4用文件存储Session变量, 但理论上可以用数据库或…

oracle日志文件大小规则,在线重做Oracle日志文件大小

下面为您介绍的方法用于实现在线重做Oracle日志文件大小&#xff0c;如果您在Oracle日志文件方面遇到过类似的问题的话&#xff0c;不妨一看。1、创建2个新的日志组alter database add logfile group 4 (D:\ORACLE\ORADATA\ORADB\REDO04_1.LOG) size 1024k;alter database add …

2021年首届.NET线下沙龙上海站 - 2021 .NET Meetup in Shanghai

.NET Conf 2020 刚刚在苏州落下帷幕&#xff0c; .NET 开发者们的热情不减&#xff0c;来自五湖四海的朋友一起参加疫情之下的 .NET 盛会。2021年上海第一场线下活动就要来了&#xff0c;快来加入我们一起学习.NET 吧&#xff01;活动时间&#xff1a;2021年1月23日 13:00-18:0…

哎,最近心情非常烦乱!

在他人眼中我是一个没有烦恼、责任、忧虑的“开心人”殊不知在我行为的掩饰之下也有着比一般人更复杂的思绪不表露自己脆弱的一面这是坚强吗我在思考也许这才是真正的脆弱 转载于:https://www.cnblogs.com/godjiahui/archive/2006/11/19/565165.html

跟我一起学Redis之加个哨兵让主从复制更加高可用

前言主从复制的实现在上一篇已经分享过&#xff0c;虽然主从复制本身的确让读写分离更加高效&#xff0c;但是对于整体高可用存在很大的劣势&#xff1a;当主节点宕机了之后还需要人为重新进行主从关系配置&#xff1b;这不是开玩笑嘛&#xff0c;这样人为干预&#xff0c;故障…

智能实验室-全能优化(Guardio) 4.0.0.670 beta 8

怎样获取最新版本&#xff1f;□全新下载&#xff1a;全能优化(Guardio)&#xff1a;http://files.cnblogs.com/unruledboy/Guardio.Release.zip智能实验室&#xff0d; 全能优化(Guardio) 4.0.0.670 beta 8 更新记录&#xff1a; 1.添加&#xff1a;系统加速 之 系统速度&…

前台提交数据到php mysql,建立一个基础的MySQL数据库,使用PHP来抓取和处理数据,并抛出给前台...

原创声明本文系作者辛苦码字所得&#xff0c;欢迎分享和转载&#xff0c;但请在明显位置注明作者的如下信息&#xff1a;笔名&#xff1a;来碗鸡蛋面简书主页&#xff1a;https://www.jianshu.com/u/4876275b5a73邮箱&#xff1a;job_tomfoxmail.comCSDN ID&#xff1a;tom_won…

如何在 ASP.Net Core 中实现 健康检查

健康检查 常用于判断一个应用程序能否对 request 请求进行响应&#xff0c;ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态。ASP.Net Core 中的 健康检查 落地做法是暴露一个可配置的 Http 端口&#xff0c;你可以使用 健康检查 去做一个最简单的活性检…

php 鼠标小手,鼠标移动至少一次时创建PHP会话(Create PHP session when mouse moved at least once)...

鼠标移动至少一次时创建PHP会话(Create PHP session when mouse moved at least once)我想在鼠标移动至少一次时创建php会话&#xff0c;如果鼠标继续移动则不需要做任何事情我正在使用此代码&#xff0c;但它没有解决要求jQuery(document).ready(function(){$(document).mouse…

【One by One系列】IdentityServer4(四)授权码流程

接下来我们介绍新内容,OAuth2.0叫做授权码(authorization code)&#xff0c;在OpenID Connect中则属于OpenId Connect Flow&#xff0c;称为授权码流程(Authorization Code Flow),这种方式主要场景&#xff1a;保密客户端&#xff0c;服务器端的web应用“例如asp.net core mvc,…

Nemuria UML架构图 第3次迭代. 重构

Nemuria UML架构图 第3次迭代. 重构

suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决

现象产生&#xff1a;服务器在挂载SUSE LINUX的系统光盘安装一些系统自带的RPM包后&#xff0c;发现HOME目录文件系统变成只读模式。附图&#xff1a;原因分析&#xff1a;在系统加载光盘之前一切正常&#xff0c;加载后出现这样的问题。加载光盘时&#xff0c;使用了mount命令…

3个值得学习和练手的.net企业级开源项目,强烈推荐

WTM项目名称&#xff1a;WTM项目所用技术栈&#xff1a;wtm mvvm mvc aspnetcore dotnetcore react vue layui layui-admin element-ui ncc等项目简介&#xff1a;WalkingTec.Mvvm框架&#xff08;简称WTM&#xff09;是基于.net core的快速开发框架。支持Layui(前后端不分离),…

通过百度 vs 奇虎,来谈博客搜索

百度推出了博客搜索&#xff0c;几乎就是一个网页搜索的翻版而已&#xff0c;唯一和网页搜索不同的&#xff0c;就是&#xff1a;1、少了广告&#xff1b;2、增加了一个博客的首页连接。看起来&#xff0c;并无太大新意。当然&#xff0c;也许他留有后着&#xff0c;也未为可知…

linux服务器数据同步,Linux服务器数据定期同步和备份方式

数据安全是做数据分析的人需要关注的一大问题。对于我们分析的关键数据、使用的关键脚本都需要定期备份。scp最简单的备份方式&#xff0c;就是使用cp (本地硬盘)或scp (远程硬盘)命令&#xff0c;给自己的结果文件新建一个拷贝;每有更新&#xff0c;再拷贝一份。具体命令如下&…

2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?

IEnumerator、IEnumerable这两个接口单词相近、含义相关&#xff0c;傻傻分不清楚。入行多年&#xff0c;一直没有系统性梳理这对李逵李鬼。最近本人在怼着why神的《其实吧&#xff0c;LRU也就那么回事》&#xff0c;方案1使用数组实现LRU&#xff0c;手写算法涉及这一对接口&a…

vs.Net2003无法打开或创建Web应用程序若干解决办法

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装&#xff0c;调试问题都被我碰到了&#xff0c;还好&#xff0c;我一个个把他记录下来了&#xff0c;同时&#xff0c;在CSDN找了一些相关的解决方法&#xff0c;不敢独享&am…

linux管理Windows文件,Linux与Windows互传文件,用户组管理和用户管理

一、与Windows互传文件linux和windows互传文件&#xff0c;需要使用Xshell&#xff0c;Linux系统需要安装lrzsz包。yum install -y lrzsz //linux安装lrzsz包# sz a.txt //Linux端传输当前目录下的a.txt到windows# rz //windows端选择传输文件到Linux当前目前二、/etc/passwd和…

浅谈​与彼得原理和责任管理有关的小故事

浅谈与彼得原理和责任管理有关的小故事一&#xff09;老王虽然今年才3年工作经验&#xff0c;但一直深受领导赏识&#xff0c;因为在大家眼里他是一个责任心特别强的人。无论是领导也好&#xff0c;同事也好&#xff0c;只要有任务安排给他&#xff0c;他都会非常欣然的接受&am…