一、IOC介绍

  IOC:全名(Inversion of Control)-控制反转

  IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们可以直接从这个外部容器中去拿,而再也不需要我们去new了,充分体现了DIP(依赖倒置原则),也体现了我们经常挂在嘴边的面向接口编程。

  DI:全名(Dependency Injection)-依赖注入

  DI意味着将类型之间的依赖关系注入到DI容器中

  在之前的.Net Framework中并没有集成IOC,虽然Microsoft自己有一套"Unity",想要使用IOC+DI时,还需要我们自己去安装包,进行三部曲等等各种操作

  比较流行的IOC容器技术:Autofac、Unity、NInject。。。

二、.net core内置IOC容器(ServiceCollection)

  1、打开NuGet包管理器,安装 Microsoft.Extensions.DependencyInjection 包

  2、实现代码如下:

    public interface ISqlHelper
{
void GetAll();
}
public class SqlServerHelper : ISqlHelper
{
public void GetAll()
{
Console.WriteLine("this is "+typeof(SqlServerHelper));
}
}
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddTransient<ISqlHelper, SqlServerHelper>();
var provider=services.BuildServiceProvider();
var sqlHelper=provider.GetService<ISqlHelper>();
sqlHelper.GetAll();
Console.ReadKey();
}

  运行结果如下:

  

  当我们在执行业务逻辑时想要写入一些日志(Log),必然会当然依赖这个类,那么会形成了SqlHelper类与Log类之前的依赖关系,我们可以将之前的依赖关系转移到DI容器中,也就是依赖注入(DI),然后在DI容器获取服务(对象)

  示例代码如下:

    public interface ILog
{
void LogInfo(string msg);
}
public class Log : ILog
{
public void LogInfo(string msg)
{
Console.WriteLine(msg);
}
}
static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddTransient<ILog, Log>();
services.AddTransient<ISqlHelper, SqlServerHelper>(); var provider=services.BuildServiceProvider();
var sqlHelper= provider.GetService<ISqlHelper>();
sqlHelper.GetAll();
Console.ReadKey();
}

  如果如下:

  

三、组件的生命周期

  1、Single:单例,全局唯一实例

  2、Scoped:作用域,在一个作用域中唯一实例,比如在Asp.Net Core应用程序中一次请求相当于一个Scoped

  3、Transient:瞬时,每次的实例都是一个新的对象

Transient:

        static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddTransient<ISqlHelper, SqlServerHelper>();
var provider=services.BuildServiceProvider();
var sqlHelper=provider.GetService<ISqlHelper>();
sqlHelper= provider.GetService<ISqlHelper>(); Console.ReadKey();
}

结果如下:

Single:

        static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddSingleton<ISqlHelper, SqlServerHelper>();
var provider=services.BuildServiceProvider();
var sqlHelper=provider.GetService<ISqlHelper>();
sqlHelper= provider.GetService<ISqlHelper>(); Console.ReadKey();
}

结果如下:

Scoped:

1、一个作用域下:

        static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<ISqlHelper, SqlServerHelper>();
var provider=services.BuildServiceProvider();
var sqlHelper=provider.GetService<ISqlHelper>();
sqlHelper= provider.GetService<ISqlHelper>(); Console.ReadKey();
}

结果如下:

2、二个作用域下:

        static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped<ISqlHelper, SqlServerHelper>();
var provider=services.BuildServiceProvider();
var scope1=provider.CreateScope();//在一个作用域下创建第一个子作用域
var scope2= provider.CreateScope();//在一个作用域下创建第二个子作用域
var sqlHelper= scope1.ServiceProvider.GetService<ISqlHelper>();
sqlHelper= scope2.ServiceProvider.GetService<ISqlHelper>(); Console.ReadKey();
}

如果如下:

注意:由于是控制台项目,只能用子作用域来体现作用域的特点,在web项目中,一次请求就相当于一个作用域

.net core系列之《.net core内置IOC容器ServiceCollection》的更多相关文章

  1. Asp.Net Core 内置IOC容器的理解

    Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...

  2. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  3. NET Core 3.0 AutoFac替换内置DI的新姿势

    原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...

  4. 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】

    原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...

  5. 简单讲解Asp.Net Core自带IOC容器ServiceCollection

    一.  理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二.  接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...

  6. ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

    应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...

  7. asp.net core 内置DI容器的一点小理解

    DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...

  8. 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)

    1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...

  9. .net core 2.0学习记录(三):内置IOC与DI的使用

    本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...

随机推荐

  1. iOS逆向开发(0):修改二进制代码与重签名 | hopper | codesigh

    小白:小程,你知道有些iOS程序是没人性的吗?老是不按我的意愿来运行! 小程:我怎么知道你的意愿就是有人性的? 本文解决一个问题:修改别人的二进制程序并运行起来. 让别人的程序按你的意愿来运行,文明一 ...

  2. Java基础系列--包装类

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5462489.html 1.8种基本数据类型都有各自的包装类,其对应关系为: 基本—————— ...

  3. vue+vue-router+vuex实战

    shopping vue + vue-router + vuex实现电商网站 效果展示 install 下载代码: git clone https://github.com/chenchangyuan ...

  4. YTKNetwork源码详解

    本篇是第三篇关于网络请求的,将讲述YTKNetwork源码,上述两篇分别讲述AFNetworking源码解析以及结合自己项目封装AFNetworking. AFNetworking源码解析:https ...

  5. [转]RPA简介

    本文转自:https://www.cnblogs.com/wendyzheng/articles/9211530.html 开篇: 公司正在全面推广RPA,正好借此机会学习一下,发现国内对RPA的了解 ...

  6. 第一册:lesson seventeen。

    原文:How do ;you do? A:Come and meet our employees,Mr.B. B:Thank you Mr.A. A:This is ...and this is .. ...

  7. 《c#图解教程》

    书名 <c#图解教程> 图片 时间 2017-10-12月 学习 第20章的异步编程很好,在项目里面很有用.东西有点多时间久了不用就忘了

  8. Echarts图表legend的排版问题(转载)

    来源:https://blog.csdn.net/david_jiahuan/article/details/80096922 案例一 项目中现有样式: 客户需求:将图例分为两列,并且上下两列的图例要 ...

  9. C#自动关闭弹出提示框

    自动关闭弹出提示框(用一个小窗体显示提示信息):例如在一个form窗体中弹出自动关闭的提示框1.首先创建一个弹出提示信息的窗体 AutoCloseMassageBox,在里面拖一个lable控件,去掉 ...

  10. Java中net.sf.json包关于JSON与对象互转的坑

    在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递.数据的格式通常有2种:1.xml:2.JSON.通常来说都是使用JSON来传递数据.本文正是介 ...