原文:https://blog.csdn.net/huwei2003/article/details/40022011

系统 可方便的替换 日志类

自己的理解:
  依赖接口,日志的实例化 不直接写在依赖类中,而是放在构造函数的参数中。目的:谁调用谁实现。然后再借助ioc自动实例化注入到构造函数中

依赖的进化

  1. //1、直接依赖Log类
  2. // 系统更换Log类比较麻烦,因为每个类都依赖具体的实现类
  3. public class ProductService1
  4. {
  5. private Log _log;
  6.  
  7. public ProductService1()
  8. {
  9. _log = new Log();
  10. }
  11.  
  12. public void SayHello()
  13. {
  14. _log.Write();
  15. }
  16. }
  17.  
  18. //2、依赖接口ILog
  19. // 方法的调用依赖接口ILog。以前是依赖具体实现类Log,换成依赖接口类ILog,这样在构造函数中可以更换其它的实现类
  20. // 在构造函数中 强依赖 ILog的具体实现
  21. public class ProductService2
  22. {
  23. private ILog _log;
  24.  
  25. public ProductService2()
  26. {
  27. _log = new Log();
  28. }
  29.  
  30. public void SayHello()
  31. {
  32. _log.Write();
  33. }
  34. }
  35.  
  36. //3、强依赖的地方 变成了 谁调用谁实现
  37. // 这样就可以 不再类ProductService3的内部 具体实现ILog,把实现的地方,转移到类的外部
  38. public class ProductService3
  39. {
  40. private ILog _log;
  41.  
  42. public ProductService3(ILog _log)
  43. {
  44. this._log = _log;
  45. }
  46.  
  47. public void SayHello()
  48. {
  49. _log.Write();
  50. }
  51. }

日志类

  1. //日志接口
  2. public interface ILog
  3. {
  4. void Write();
  5. }
  6. //日志类1 实现 日志接口
  7. public class Log : ILog
  8. {
  9. public void Write()
  10. {
  11. Console.Write("Log");
  12. }
  13. }
  14. //日志类2 实现 日志接口
  15. public class TxtLog : ILog
  16. {
  17. void ILog.Write()
  18. {
  19. Console.Write("TxtLog");
  20. }
  21. }
  22. //日志类3 实现 日志接口
  23. public class DbLog : ILog
  24. {
  25. void ILog.Write()
  26. {
  27. Console.Write("DbLog");
  28. }
  29. }

调用方法

  1. //这种写法 一个不好地方。有很多类需要依赖ILog,就在很多个地方依赖
  2. public void test4()
  3. {
  4. ILog log = new Log();
  5. var productService = new ProductService3(log);
  6. productService.SayHello();
  7. }
  8.  
  9. //依赖由ioc框架自动管理
  10. public void test5()
  11. {
  12. ContainerBuilder builder = new ContainerBuilder();
  13.  
  14. //替换系统的日志类
  15. //builder.RegisterType<Log>().As<ILog>();
  16. //builder.RegisterType<TxtLog>().As<ILog>();
  17. builder.RegisterType<DbLog>().As<ILog>();
  18.  
  19. builder.RegisterType<ProductService3>();
  20. IContainer container = builder.Build();
  21. var productService = container.Resolve<ProductService3>();
  22. productService.SayHello();
  23. }

C# 对IOC的理解 依赖的转移的更多相关文章

  1. 理解依赖注入(DI - Dependency Injection)

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  2. 理解依赖注入(IOC)和学习Unity

    资料1: IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一 ...

  3. 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  4. 【转】理解依赖注入(IOC)和学习Unity

    IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection).作用:将各层的对象以松耦合的方式组织在一起,解耦,各 ...

  5. C# 一个初学者对 依赖注入 IOC 的理解( 含 Unity 的使用)

    通过 人打电话 来谈谈自己对IOC的理解 版本1.0 public class Person { public AndroidPhone Phone { get; set; } public void ...

  6. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖

    DIP依赖倒置原则:系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖依赖抽象,而不是细节 贯彻依赖倒置原则,左边能抽象,右边实例化的时候不能直接用抽象,所以需要借助一个第三方 高层本来是依 ...

  7. 学习Unity -- 理解依赖注入(IOC)三种方式依赖注入

    IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection).作用:将各层的对象以松耦合的方式组织在一起,解耦,各 ...

  8. IOC的理解

    转载http://www.cnblogs.com/xdp-gacl/p/4249939.html 很不错的文章,虽说是java的,但是.net也通用,所以复制一分,拿来看看挺不错的. 1.1.IoC是 ...

  9. 谈谈对Spring IOC的理解(转)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

随机推荐

  1. 协议——SPI

    SPI(Serial Peripheral interface)是由摩托罗拉公司定义的一种串行外围设备接口,是一种高速.全双工.同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB的布局. ...

  2. js注意点

    1.在JS中:var a=''; 则 a==0或a==false 结果都为true;  如果是“====” 则为false

  3. gcc 编译控制选项

    gcc 编译控制选项前面已经讲过, gcc 的基本用法是:$ gcc [选项] [文件名]gcc 有很多编译控制选项,使得 gcc 可以根据不同的参数进行不同的编译处理,可供 gcc调用的参数大约有 ...

  4. IOS - UDID IDFA IDFV MAC keychain

    在开发过程中,我们经常会被要求获取每个设备的唯一标示,以便后台做相应的处理.我们来看看有哪些方法来获取设备的唯一标示,然后再分析下这些方法的利弊. 具体可以分为如下几种: UDID IDFA IDFV ...

  5. java web编程 servlet3

     

  6. robot framework笔记(三):扩展SeleniumLibrary库 (自定义关键字)

    (一)自定义和浏览器相关的关键字 以下代码GitHub 版本库地址: https://github.com/blairwind/blog_rf SeleniumLibrary的扩展文档中提供了3种增加 ...

  7. MySQL Index--NOT IN和不等于两类操作无法走索引?

    经常被问,NOT IN和<>操作就无法走索引? 真想只有一个:具体问题具体分析,没有前提的问题都是耍流氓. 准备测试数据: ## 删除测试表 DROP TABLE IF EXISTS tb ...

  8. java对象序列化和反序列化,redis存入和获取对象

    最近使用redis发现直接存储序列化后的对象更方便,现提供java序列化和反序列化的代码 1.序列化代码: public static byte[] serialize(Object object) ...

  9. Redhat下Oracle 12c单节点安装

    操作系统:Redhat6.7 64位[root@Oracle12CDB ~]# more /etc/redhat-release Red Hat Enterprise Linux Server rel ...

  10. Android笔记(三十八) Android中的数据存储——SharedPreferences

    SharedPreferences是Android提供的一种轻型的数据存储方法,其本质是基于xml文件存储的,内部数据以key-value的方式存储,通常用来存储一些简单的配置信息. SharedPr ...