.net core 2.0学习记录(三):内置IOC与DI的使用
2018-01-10 17:13
621 查看
本篇的话介绍下IOC和ID的含义以及如何使用.Net Core中的DI。
一。我是这么理解IOC和DI的:
IOC:没有用IOC之前是直接new实例来赋值,使用IOC之后是通过在运行的时候根据配置来实例化具体对象,这个控制权由内部转到外部的过程就可以理解为IOC(控制反转)
DI:由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中
二。在.Net Core中使用
假设有这样一个业务:现在网站记录日志是存在文本文件中,可能以后会需要存在数据库,这时候就不能直接new来实例化具体对象,可以用DI来解决。
1.我们先建好一个.Net Core项目,在其中添加一个接口和两个具体实现类:
2.在Startup的ConfigureServices方法中注册,假设现在使用文件来记录日志:
现在运行项目的话会输出 FileLog:记录一个错误消息 ,如果以后需要改成数据库只需要改成如下:
通过这种方式就将具体实现解耦了,以后新增Redis记录或者其他记录方式,只需要增加对应的类实现ILog接口再通过配置即可。
如果我们想使用.Net Core中已经通过DI注册好的类,可以在控制器的构造函数中写上接口名即可(前提是.Net Core中已经注册了该接口的具体实现类)
三。.NET Core DI 为我们提供的实例生命周有三种:
1.Transient: 每一次都会创建一个新的实例
2.Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)
3.Singleton :整个应用程序生命周期以内只创建一个实例
我们可以通过具体业务来选择不同的实例创建方式。
一。我是这么理解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学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道
- MVC框架IOC容器与DI的实现(《架构探险》的学习记录)
- 学习记录1:Maven内置属性及使用
- .Net Core简单使用Mvc内置的Ioc
- [.Net Core] 简单使用 Mvc 内置的 Ioc(续)
- .Net Core 中的 DI使用 - IOC原则
- 从壹开始前后端分离【 .NET Core2.0 Api + Vue 3.0 + AOP + 分布式】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- .net core 2.0学习记录(一):搭建一个.Net Core网站项目
- [.Net Core] 简单使用 Mvc 内置的 Ioc
- .Net Core简单使用Mvc内置的Ioc(续)
- .Net Core简单使用Mvc内置的Ioc
- [.Net Core] 简单使用 Mvc 内置的 Ioc(续)
- 从壹开始前后端分离【 .NET Core2.0 Api + Vue 3.0 + AOP + 分布式】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
- 学习NUnit测试3(比较详细的NUnit2.0使用说明[转])
- spring2.0学习(二)Ioc概念
- 【翻译】使用ASP.NET 2.0记录错误
- Scott Mitchell 的ASP.NET 2.0数据教程之三十一::使用DataList来一行显示多条记录
- GDI+ 学习记录(6): 使用画刷建立画笔
- java下使用TeeChart生成图表的学习记录