.net core系列之《.net core内置IOC容器ServiceCollection》
一、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》的更多相关文章
- Asp.Net Core 内置IOC容器的理解
Asp.Net Core 内置IOC容器的理解 01.使用IOC容器的好处 对接口和实现类由原来的零散式管理,到现在的集中式管理. 对类和接口之间的关系,有多种注入模式(构造函数注入.属性注入等). ...
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- NET Core 3.0 AutoFac替换内置DI的新姿势
原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原 ...
- 浏览器扩展系列————给MSTHML添加内置脚本对象【包括自定义事件】
原文:浏览器扩展系列----给MSTHML添加内置脚本对象[包括自定义事件] 使用场合: 在程序中使用WebBrowser或相关的控件如:axWebBrowser等.打开本地的html文件时,可以在h ...
- 简单讲解Asp.Net Core自带IOC容器ServiceCollection
一. 理解ServiceCollection之前先要熟悉几个概念:DIP.IOC.DI.Ioc容器: 二. 接下来先简单说一下几个概念问题: 1.DIP(依赖倒置原则):六大设计原则里面一种设计原 ...
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件
应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用. ASP.NET ...
- asp.net core 内置DI容器的一点小理解
DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC). 具体体现为Micorosoft.Extensio ...
- 学习笔记:GLSL Core Tutorial – Vertex Shader(内置变量说明)
1.每个Vertex Shader都有用户定义的输入属性,例如:位置,法线向量和纹理坐标等.Vertex Shaders也接收一致变量(uniform variables). uniform vari ...
- .net core 2.0学习记录(三):内置IOC与DI的使用
本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI. 一.我是这么理解IOC和DI的: IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实 ...
随机推荐
- DWR第三篇之逆向Ajax升级
1. 本示例在第二篇架构基础上添加代码 2.在client.jsp开头的地方添加如下代码: 本示例需要做的是定向推送,那么就需要浏览器进行登录,从而进行定向的推送功能,为了节省时间,这里不做登录模块了 ...
- Go内置函数cap
func cap(v Type) int 返回指定类型的容量,根据不同类型,返回意义不同. 数组: 元素个数 (和len(v)一样). 数组指针: *v的元素个数 (和len(v)一样). Slice ...
- shell脚本--echo和printf打印输出
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 注:本文关于引号等特殊符号的处理仅仅只是几个例子,想要彻底搞明 ...
- Apollo 7 — ConfigService 消息扫描设计实现
目录 设计 代码实现 总结 1.设计 Apollo 为了减少依赖,将本来 MQ 的职责转移到了 Mysql 中.具体表现为 Mysql 中的 ReleaseMessage 表. 具体官方文档可见:发送 ...
- Linux核心命令
Linux核心命令 strace(查看系统调用的一个过程) 例:strace cat /test.txt netstat perf top pidstat mpstat dstat vmstat sl ...
- Packet for query is too large (12238 > 1024). You can change this value
MySQL max_allowed_packet 设置过小导致记录写入失败 mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会受max_allowed_packet 参 ...
- WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...
- SQL Server远程连接 provider: Named Pipes Provider, error: 40 解决方法
置SQLServer,允许远程连接 按照上面的文章一步步配置后,远程连接出现下面所示的报错(Navicat 和 SQL Server Management Studio) SQL Server Man ...
- 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 ...
- Nginx之OCSP stapling配置
摘要: 正确地配置OCSP stapling, 可以提高HTTPS性能. 什么是OCSP stapling? OCSP的全称是Online Certificate Status Protocol,即在 ...