本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI。

一。我是这么理解IOC和DI的:

IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实例化具体对象,这个控制权由内部转到外部的过程就可以理解为IOC(控制反转)

DI:由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中

二。在.Net Core中使用

假设有这样一个业务:现在网站记录日志是存在文本文件中,可能以后会需要存在数据库,这时候就不能直接new来实例化具体对象,可以用DI来解决。

1.我们先建好一个.Net Core项目,在其中添加一个接口和两个具体实现类:

    public interface ILog
{
void Write(string msg);
}
    public class FileLog : ILog
{
public void Write(string msg)
{
//假设这里是存入文件
Debug.WriteLine("FileLog:" + msg);
}
}
    public class DBLog : ILog
{
public void Write(string msg)
{
//假设这里是存入数据库
Debug.WriteLine("DBLog:" + msg);
}
}

2.在Startup的ConfigureServices方法中注册,假设现在使用文件来记录日志:

        public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); services.AddSingleton<ILog, FileLog>();
}
    public class HomeController : Controller
{
ILog log = null;
public HomeController(ILog _log)
{
log = _log;
} public IActionResult Index()
{
log.Write("记录一个错误消息");
return View();
}
}

现在运行项目的话会输出 FileLog:记录一个错误消息 ,如果以后需要改成数据库只需要改成如下:

services.AddSingleton<ILog, DBLog>();

通过这种方式就将具体实现解耦了,以后新增Redis记录或者其他记录方式,只需要增加对应的类实现ILog接口再通过配置即可。

如果我们想使用.Net Core中已经通过DI注册好的类,可以在控制器的构造函数中写上接口名即可(前提是.Net Core中已经注册了该接口的具体实现类)

        public HomeController(IHostingEnvironment env)
{
Console.BackgroundColor = ConsoleColor.Red;
Console.WriteLine(env.EnvironmentName);
}

三。.NET Core DI 为我们提供的实例生命周有三种:

1.Transient: 每一次都会创建一个新的实例

2.Scoped:  在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)

3.Singleton :整个应用程序生命周期以内只创建一个实例

我们可以通过具体业务来选择不同的实例创建方式。

.net core 2.0学习记录(三):内置IOC与DI的使用的更多相关文章

  1. .net core 2.0学习记录(一):搭建一个.Net Core网站项目

    .Net Core开发可以使用Visual Studio 2017或者Visual Studio Code,下面使用Visual Studio 2017搭建一个.net Core MVC网站项目. 一 ...

  2. .net core 2.0学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道

    .net Core中没有继续沿用以前asp.net中的管道事件,而是开发了一个新的管道(Middleware): public class MiddlewareDemo { private reado ...

  3. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  4. JavaScript学习记录三

    title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  5. ASP.NET Core 1.0 开发记录

    官方资料: https://github.com/dotnet/core https://docs.microsoft.com/en-us/aspnet/core https://docs.micro ...

  6. 3.VUE前端框架学习记录三:Vue组件化编码1

    VUE前端框架学习记录三:Vue组件化编码1文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  7. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

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

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

  9. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

随机推荐

  1. Python os.walk文件遍历

    os.walk(top, topdown=True, onerror=None, followlinks=False) 可以得到一个三元tupple(dirpath, dirnames, filena ...

  2. JAVA有关命名规范

    包名:          xxxyyyzzz 全小写 类名/接口名:XxxYyyZzz 所有单词首字母大写,其他小写 方法名:       xxxYyyZzz第一个单词首字母小写,其他单词首字母大写 ...

  3. java有关Time类型数据的接收和转换

    一:前言 有关Time的时间其实很少有用到.但是用到就很纠结了,转换和保存,都是烦人的事情,我自己就在这上面吃过一个亏,所以就加载下来吧! 二:内容 (1):被坑的地方 实体类 import java ...

  4. 【Codeforces441E】Valera and Number [DP]

    Valera and Number Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 5 3 ...

  5. [CodeChef - GERALD07 ] Chef and Graph Queries

    Read problems statements in Mandarin Chineseand Russian. Problem Statement Chef has a undirected gra ...

  6. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  7. webpack4.x 入门一篇足矣

    前言: webpack4出了以后,一些插件变化很大,和之前的版本使用方式不一样,新手入坑,本篇将介绍如何从一开始配置webpack4的开发版本,对css,js进行编译打包合并生成md5,CSS中的图片 ...

  8. Spring基础使用(一)--------IOC、Bean的XML方式装配

    基础 1.xml文件基础格式: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns=&q ...

  9. NodeJS 微信公共号开发 - 响应微信发送的Token验证(山东数漫江湖)

    背景 使用 NodeJS 进行微信公共号开发,首先需要响应微信发送的Token验证,官方文档 填写服务器配置 登录微信公共平台,在开发下的基本配置打开该页面. 依次填写接口的 URL.自定义的 Tok ...

  10. 实现拷贝函数(strcpy)

    #include <stdio.h> #include <stdlib.h> // 函数声明 char *mystrcpy(char *object, char *source ...