一段代码

class Program
{
static void Main(string[] args)
{
var shop=new Shop();
shop.Add();
shop.Delete();
Console.ReadKey();
}
}
class Shop
{
readonly Log4NetServices _logServices; public Shop()
{
_logServices = new Log4NetServices();
} public void Add()
{
_logServices.Write("增加商品");
} public void Delete()
{
_logServices.Write("删除商品");
}
}

问题

  • 依赖具体Log4NetServices,要换成FileLogServices就要改

依赖

依赖就是依赖抽象

变形:

readonly ILogServices _logServices;

这样在实际使用中,不用管ILogServices的实现,由Shop的构造函数负责给具体实现

问题

  • Shop本身也不知道是用Log4NetServices还是FileLogServices,但使用者肯定是知道的。

注入

注入就是将你需要的东西传给你,不用你自己new

变形:

class Program
{
static void Main(string[] args)
{
var shop=new Shop(new Log4NetServices());
shop.Add();
shop.Delete();
shop=new Shop(new FileLogServices());
shop.Add();
shop.Delete();
Console.ReadKey();
}
}
class Shop
{
readonly ILogServices _logServices; public Shop(ILogServices logServices)
{
_logServices = logServices;
} public void Add()
{
_logServices.Write("增加商品");
} public void Delete()
{
_logServices.Write("删除商品");
}
}

问题:

  • 需要的人多了,我一个个new?
  • 需要的种类多了,我一个个new?
  • 能不能把new的东西放一起,需要的人统一从里面拿。

IOC

dotnetcore 的ioc示例

class Program
{
static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<ILogServices, Log4NetServices>();
var serviceProvider = serviceCollection.BuildServiceProvider();
var logServices = serviceProvider.GetService<ILogServices>();
var shop = new Shop(logServices);
shop.Add();
shop.Delete();
Console.ReadKey();
}
}

一步步到IOC的更多相关文章

  1. IoC和DI的理解

    1 概述 当我们想闭上眼睛想如何让我们的软件更加可用可维护时,我们总能想到一个词:松耦合.在这篇文章中,主要讲述了模块间存在的依赖关系,但这种依赖关系违背了依赖倒置原则.在这之后,我们将讨论一种解除软 ...

  2. 初始化IoC容器(Spring源码阅读)-我们到底能走多远系列(31)

    我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? 毕竟,对自己的收入的分配差不多体现了自己的 ...

  3. 挖坟之Spring.NET IOC容器初始化

    因查找ht项目中一个久未解决spring内部异常,翻了一段时间源码.以此文总结springIOC,容器初始化过程. 语言背景是C#.网上有一些基于java的spring源码分析文档,大而乱,乱而不全, ...

  4. 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)

    文件夹      [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器開始(八)      [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入 ...

  5. 初始化IoC容器(Spring源码阅读)

    初始化IoC容器(Spring源码阅读) 我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? ...

  6. 自己动手编写IOC框架(二)

    万事开头难,上篇已经起了一个头,之后的事情相对就简单了.上次定义了框架所需的dtd也就是规定了xml中该怎么写,有哪些元素.并且我们也让dtd和xml绑定在了一起,使dtd对xml的格式进行校验,并且 ...

  7. ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

    前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不详细的赘述IOC是什么 以及DI是什么了 ...

  8. Laravel 服务容器,IoC,DI

    DI DI 就是常说的依赖注入,那么究竟什么是依赖注入呢? 打个比方,电脑(非笔记本哈)需要键盘和鼠标我们才能进行操作,这个‘需要’换句话说就是‘依赖’键盘和鼠标. 那么,相应的,一个类需要另一个类才 ...

  9. 【Spring源码解析】—— 结合SpringMVC过程理解IOC容器初始化

    关于IOC容器的初始化,结合之前SpringMVC的demo,对其过程进行一个相对详细的梳理,主要分为几个部分: 一.IOC的初始化过程,结合代码和debug过程重点说明 1. 为什么要debug? ...

随机推荐

  1. 本地VSCode编辑远程服务器文件

    前言 先说下我的场景:服务器搭设了一系列复杂环境,然后需要使用PHP实现某些功能 选这种远程编辑的原因: 首先PHP打死我也不想装(这个现在是出了VB外最惹人厌的语言了) 然后环境比较复杂,本地装下比 ...

  2. sql中#与$取值

    在mapper.xml中#与$都是用来取值的 <update id="addUrl"> update user_power set url = #{newurl} wh ...

  3. 关于原生js中函数的三种角色和jQuery源码解析

    原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...

  4. js 前端实现打印功能

      // 此处是一个打印的方法  可以在点击事件的时候调用 dayin = () =>{ // 获取当前页面要打印的内容  // 这里的className(‘print’)是我给要打印的区域起的 ...

  5. Codeforces 1008D/1007B

    题意略. 思路: 由于这个长方体是可以翻转的,所以我们不必考虑小长方体3个维度的出处,反正3条边一定有长有短能分出大小. 现在我们来考虑A,B,C三个数字,如果它们3个产生的因子互不相同,分别产生了a ...

  6. 关于post和get的区别

    首先,get和post并没有本质上的区别,都只是 HTTP 协议中两种请求方式,用的都是同一个传输层协议,在传输上并没有什么不同.     1.get和post报文上的区别 GET 和 POST 只是 ...

  7. 《GO Home Trash!》UML类图,ER图以及数据库设计

    <Go Home Trash!>UML类图 ER图以及数据库中数据表 分析: 这款软件经过我们前期的讨论以及需求分析,确定了用户,客服以及管理员三个实体.在设计UML类图时,对各个实体之间 ...

  8. 工作中遇到的99%SQL优化,这里都能给你解决方案

    前几篇文章介绍了mysql的底层数据结构和mysql优化的神器explain.后台有些朋友说小强只介绍概念,平时使用还是一脸懵,强烈要求小强来一篇实战sql优化,经过周末两天的整理和总结,sql优化实 ...

  9. 18年ACM赛后总结

    今天,我们浙理养老队在18年赛季的比赛正式宣布结束了,先恭喜我们队在3场区域赛中拿了两块金牌,一块银牌,损失我的身份证我的U盘我的耳机,老天啊,队友不是拿来顶替自己的霉运的嘛,让他们的丢东西啊,别让我 ...

  10. vue.js安装教程

    vue.js环境搭建 1.下载node.js 网址:https://nodejs.org/en/ 版本:v10.16.3 2.安装node.js Node.js下载如下所示: 检查nodejs是否安装 ...