一、控制反转:

从简单的代码示例入手:

    /// <summary>/// 邮件服务类/// </summary>public class EmailService{public string SendMessage(){return "发送通知邮件";}}/// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private EmailService service;public NotifycationSystem(){service = new EmailService(); //邮件通知类必须精确的知道创建和使用了哪种类型的服务,此处高耦合了。}public string InterestingEventHappened(){return service.SendMessage();}}

共两个类,一个邮件服务类,一个邮件通知类,邮件通知类依赖于邮件服务类。邮件通知类必须精确的知道创建和使用了哪种类型的服务,此处高耦合了。

改进一:在两代码块中引入抽象层,提取接口。

    /// <summary>/// 邮件服务接口/// </summary>public interface IMessageService{string SendMessage();}/// <summary>/// 邮件服务类/// </summary>public class EmailService : IMessageService{public string SendMessage(){return "发送通知邮件";}}/// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private IMessageService service;//邮件通知类保存服务实现的接口public NotifycationSystem(){service = new EmailService(); }public string InterestingEventHappened(){return service.SendMessage();}}

上面将依赖具体实现改为了依赖接口,减少了部分耦合。但是邮件服务类还是在邮件通知类内实例化的,也就是说邮件通知类还是要完全知道邮件服务类的具体细节。

改进二:将选择抽象实现的责任移到服务消费者类的外部。

    /// <summary>/// 第二层抽象: 服务定位器/// </summary>public interface IServiceLocator{IMessageService GetMessageService();}/// <summary>/// 第一层抽象:邮件服务接口/// </summary>public interface IMessageService{string SendMessage();}/// <summary>/// 邮件服务类/// </summary>public class EmailService : IMessageService{public string SendMessage(){return "发送通知邮件";}}/// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private IMessageService service;//邮件通知类保存服务实现的接口。public NotifycationSystem(IServiceLocator locator){service = locator.GetMessageService();//实现依赖关系被转移到类外。}public string InterestingEventHappened(){return service.SendMessage();}}

扩展一:弱类型服务定位器。

/// <summary>/// 第二层抽象: 服务定位器/// </summary>public interface IServiceLocator{object GetService(Type serviceType);}/// <summary>/// 第一层抽象:邮件服务接口/// </summary>public interface IMessageService{string SendMessage();}/// <summary>/// 邮件服务类/// </summary>public class EmailService : IMessageService{public string SendMessage(){return "发送通知邮件";}}/// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private IMessageService service;//邮件通知类保存服务实现的接口。public NotifycationSystem(IServiceLocator locator){service = (IMessageService)locator.GetService(typeof(IMessageService));//实现依赖关系被转移到类外。}public string InterestingEventHappened(){return service.SendMessage();}}

弱类型服务定位器使得这种模式更加灵活,因为他允许请求任意类型的服务类型。采用Type类型的参数,并返回一个非类型化的示例,也就是一个object类型对象。

扩展二:泛型方法。

    /// <summary>/// 第二层抽象: 服务定位器/// </summary>public interface IServiceLocator{T GetService<T>();//泛型接口object GetService(Type serviceType);}/// <summary>/// 第一层抽象:邮件服务接口/// </summary>public interface IMessageService{string SendMessage();}/// <summary>/// 邮件服务类/// </summary>public class EmailService : IMessageService{public string SendMessage(){return "发送通知邮件";}}/// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private IMessageService service;//邮件通知类保存服务实现的接口。public NotifycationSystem(IServiceLocator locator){service = locator.GetService<IMessageService>();//实现依赖关系被转移到类外。}public string InterestingEventHappened(){return service.SendMessage();}}

泛型方法,让依赖反转代码看上去更加高效优雅。

二、依赖注入:

1.构造函数注入:

    /// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private IMessageService _service;public NotifycationSystem(IMessageService service)//构造函数注入{_service = service;}public string InterestingEventHappened(){return _service.SendMessage();}}

2.属性注入:

    /// <summary>/// 邮件通知类/// </summary>public class NotifycationSystem{private IMessageService MessageService { get; set; }public string InterestingEventHappened(){if (MessageService == null){throw new InvalidOperationException("服务类型为赋值!");}return MessageService.SendMessage();}}

设计模式——控制反转依赖注入相关推荐

  1. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程...

    那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰--依赖倒置•控制反转•依赖注入•面向接口编程.也 ...

  2. Spring 的控制反转/依赖注入

    第一章 Spring 的控制反转/依赖注入 回顾 增删改查. 课前测: 本章内容 spring:春天 IOC:将创建对象的权力交给 spring 核心容器去控制.工厂模式 BeanFactory: 懒 ...

  3. 控制反转---依赖注入理解

    在学习Spring的时候,意外找到这个控制反转(IoC)和面向切面(AOP)的容器框架之前,我们先来看一下什么是控制反转(IoC). 控制反转(Ioc)和依赖注入(DI)刚听到感到很难理解,平时也程序 ...

  4. 【C#|.NET】从控制反转(依赖注入)想到事件注入 (非AOP)

    前文 事件注入的想法是由依赖注入所联想到 依赖注入不算什么吸引人的话题 本篇就不详说了 不过有闲暇时间的机会不妨按照自己的兴趣去摸索.研究一些东西,也是一种乐子. 在抓虫系列里简单的描述一下依赖注入在 ...

  5. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程【转】...

    那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰.也许时至今日,你仍对它们一知半解.不过就在今天, ...

  6. 【转】那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

    作者:在好 链接:https://www.zhihu.com/question/31021366/answer/102239756 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  7. 控制反转/依赖注入概念

    控制反转概念 控制反转是影响广泛的设计模式,其主要目的就是为了管理对象之间的关系,为对象之间解除耦合,把对象生命周期的管理和关系的管理这些和对象个体无关的公共任务交给公共容器处理. 控制反转有如下好处 ...

  8. 高深术语——依赖倒置•控制反转•依赖注入•面向接口编程

    今天,我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些"高深术语"中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. 高聚合·低耦合 简短:管理好自己(内聚),但是有 ...

  9. Spring框架学习笔记(1) ---[spring框架概念 , 初步上手使用Spring , 控制反转 依赖注入初步理解 ]

    spring官网 -->spring官网 spring5.3.12–>spring-framework 在线文档 --> Spring 5.3.12 文章目录 1.Spring概论 ...

最新文章

  1. 新书上市 | 《复分析:可视化方法》
  2. jquery-migrate.js
  3. c语言程序设计章节作业网上,C语言程序设计第17章在线测试
  4. 【转】MyEclipse快捷键大全
  5. VC++的学习(基于VS2008)——windows程序内部运行机制
  6. 【Flink】flink ClickHouseSink--数据写入ClickHouse
  7. 机器人挠人脚心_挠同学脚心
  8. Ubuntu全盘备份与恢复,亲自总结,实测可靠
  9. 2021-11-16-小甲鱼python教学视频总结
  10. 一文读懂二级分销返利模式,商城系统源码机制分享
  11. python 网络监控系统手机版下载_云视通网络监控系统手机版下载_云视通下载手机版-太平洋下载中心...
  12. led灯光衰怎么解决_揭秘LED灯具光衰原因
  13. Mac连接Ubuntu服务器并用屏幕共享app显示远程应用图形界面
  14. 晒晒那些我在云栖社区获得的奖品
  15. Eclipse使用Log4j2的详细教程
  16. Java后端开发工程师
  17. Vue3.2 使用 汉字转拼音的插件pinyin-pro 库
  18. Java实现背包问题之01背包(是否装满),完全背包
  19. ABB机器人FTP传输机器人文件
  20. 预约挂号医院管理项目----Service-cmn模块—数据字典

热门文章

  1. Hello!The familiar and strange world.
  2. 我怎么在AD里面找到已经改名的Administrator账户?
  3. [Delphi] Webbroker ISAPI 示例说明
  4. STL: set相关算法
  5. 【源码分享】用Java写的网页图片、CSS、JavaScript分类下载器
  6. 40个迹象表明你还是PHP菜鸟
  7. python encoding报错_python用requests递归查询页面 报错 ChunkedEncodingError
  8. python无师自通配套资源_Python Tkinter Pack布局管理器(超级详细,看了无师自通)...
  9. innodb一页为什么要存储两行记录_InnoDB中的页合并与分裂
  10. ipad连接电脑_Ipad已经停用需要连接iTunes的一种解决方案,