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

系统 可方便的替换 日志类

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

依赖的进化

    //1、直接依赖Log类
// 系统更换Log类比较麻烦,因为每个类都依赖具体的实现类
public class ProductService1
{
private Log _log; public ProductService1()
{
_log = new Log();
} public void SayHello()
{
_log.Write();
}
} //2、依赖接口ILog
// 方法的调用依赖接口ILog。以前是依赖具体实现类Log,换成依赖接口类ILog,这样在构造函数中可以更换其它的实现类
// 在构造函数中 强依赖 ILog的具体实现
public class ProductService2
{
private ILog _log; public ProductService2()
{
_log = new Log();
} public void SayHello()
{
_log.Write();
}
} //3、强依赖的地方 变成了 谁调用谁实现
// 这样就可以 不再类ProductService3的内部 具体实现ILog,把实现的地方,转移到类的外部
public class ProductService3
{
private ILog _log; public ProductService3(ILog _log)
{
this._log = _log;
} public void SayHello()
{
_log.Write();
}
}

日志类

    //日志接口
public interface ILog
{
void Write();
}
//日志类1 实现 日志接口
public class Log : ILog
{
public void Write()
{
Console.Write("Log");
}
}
//日志类2 实现 日志接口
public class TxtLog : ILog
{
void ILog.Write()
{
Console.Write("TxtLog");
}
}
//日志类3 实现 日志接口
public class DbLog : ILog
{
void ILog.Write()
{
Console.Write("DbLog");
}
}

调用方法

        //这种写法 一个不好地方。有很多类需要依赖ILog,就在很多个地方依赖
public void test4()
{
ILog log = new Log();
var productService = new ProductService3(log);
productService.SayHello();
} //依赖由ioc框架自动管理
public void test5()
{
ContainerBuilder builder = new ContainerBuilder(); //替换系统的日志类
//builder.RegisterType<Log>().As<ILog>();
//builder.RegisterType<TxtLog>().As<ILog>();
builder.RegisterType<DbLog>().As<ILog>(); builder.RegisterType<ProductService3>();
IContainer container = builder.Build();
var productService = container.Resolve<ProductService3>();
productService.SayHello();
}

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. Java -- 基于JDK1.8的ThreadLocal源码分析

    1,最近在做一个需求的时候需要对外部暴露一个值得应用  ,一般来说直接写个单例,将这个成员变量的值暴露出去就ok了,但是当时突然灵机一动(现在回想是个多余的想法),想到handle源码里面有使用过Th ...

  2. NetworkStream的使用(TcpClient,TcpListener)

    1.在tcp连接中,Networkstream可以重复读取,重复写入,不用关掉连接. 2.关掉NetworkStream会自动关闭掉Tcp连接 3.NetworkStream不需要使用Flush方法, ...

  3. Expanded, SingleChildScrollView, CustomScrollView, container, height, width

    SingleChildScrollView, CustomScrollView, container, init: double.inifinity. then use Expanded to con ...

  4. 微服务与SpringCloud简介

    A.官网 https://spring.io/projects/spring-cloud B.简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用 ...

  5. vue项目在ie中空白问题

    vue项目在ie浏览器中出现空白,f12打开后发现在body下面就只有一个div盒子,因此我们可以猜测就是js没有引入导致的,所有网上看了一些相关的才知道,在ie中无法解析es6或者版本更高的语法,所 ...

  6. svg实现圆环进度条

    开源实现:https://github.com/lugolabs/circles 自行实现:圆环与svg画布间剩的空间太多. <!DOCTYPE html> <html> &l ...

  7. Java 之 Servlet 3.0

    Servlet 3.0 好处: 支持注解配置,不需要 web.xml 文件了. 步骤: (1)创建 Java EE 项目,注意:JavaEE 版本必须6.0以上才支持Servlet3.0,可以不创建 ...

  8. Qt 接受拖放

    第一步:在构造函数里面 添加拖放支持,相当于总开关(注意这里设置之后是整个窗口可以接受拖放) setAcceptDrops(true); 第二步:重写接受拖放相关的虚函数 void dragEnter ...

  9. XnViewer管理浏览照片、图片

    有时候拍完照片想要浏览照片.浏览照片的时候想做一些标记,这个时候就需要使用照片管理器: 之前一直使用谷歌的picasa(不更新了),adobe也有个管理器(比较大):这里主要推荐一个: https:/ ...

  10. SpringBoot+SpringCloud+vue+Element开发项目——集成Druid数据源

    添加依赖 pom.xml <!--druid--> <dependency> <groupId>com.alibaba</groupId> <ar ...