一、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. DWR第三篇之逆向Ajax升级

    1. 本示例在第二篇架构基础上添加代码 2.在client.jsp开头的地方添加如下代码: 本示例需要做的是定向推送,那么就需要浏览器进行登录,从而进行定向的推送功能,为了节省时间,这里不做登录模块了 ...

  2. Go内置函数cap

    func cap(v Type) int 返回指定类型的容量,根据不同类型,返回意义不同. 数组: 元素个数 (和len(v)一样). 数组指针: *v的元素个数 (和len(v)一样). Slice ...

  3. shell脚本--echo和printf打印输出

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 注:本文关于引号等特殊符号的处理仅仅只是几个例子,想要彻底搞明 ...

  4. Apollo 7 — ConfigService 消息扫描设计实现

    目录 设计 代码实现 总结 1.设计 Apollo 为了减少依赖,将本来 MQ 的职责转移到了 Mysql 中.具体表现为 Mysql 中的 ReleaseMessage 表. 具体官方文档可见:发送 ...

  5. Linux核心命令

    Linux核心命令 strace(查看系统调用的一个过程) 例:strace cat /test.txt netstat perf top pidstat mpstat dstat vmstat sl ...

  6. Packet for query is too large (12238 > 1024). You can change this value

    MySQL max_allowed_packet 设置过小导致记录写入失败 mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参 ...

  7. WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件

    在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...

  8. SQL Server远程连接 provider: Named Pipes Provider, error: 40 解决方法

    置SQLServer,允许远程连接 按照上面的文章一步步配置后,远程连接出现下面所示的报错(Navicat 和 SQL Server Management Studio) SQL Server Man ...

  9. How to Create a First Shell Script

    How to Create a First Shell Script   Shell scripts are short programs that are written in a shell pr ...

  10. Nginx之OCSP stapling配置

    摘要: 正确地配置OCSP stapling, 可以提高HTTPS性能. 什么是OCSP stapling? OCSP的全称是Online Certificate Status Protocol,即在 ...