ASP.NET Core 2.0系列学习笔记-DI依赖注入
2018-02-28 16:16
1421 查看
依赖注入(Dependency Injection):当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。而依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫做控制反转,创建被调用者的实例的工作由IOC容器来完成,然后注入调用者,因此也称作依赖注入。
)控制反转(IoC/Inverse Of Control): 调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
)依赖注入(DI/Dependence injection) : 容器创建好实例后再注入调用者称为依赖注入。
1、Startup类能够选择性地在构造函数中接受通过依赖注入提供的依赖项。Startup类必须定义一个Configure方法,可选择定义一个ConfigureServices方法,这些方法将在应用程序启动时被调用。
2、Configure方法用于指定ASP.NET应用程序将如何响应每一个HTTP请求。
注入服务Services:
AddTransient:每次调用范围,瞬态;
AddScoped:单次请求范围内,域内;
AddSingletion:整个应用范围,单例;
应用:
一、通过构造函数使用接口;
1.自定义接口服务:/// <summary>
/// 定义一个接口
/// </summary>
public interface IABC
{
void SayHi();
}
/// <summary>
/// 定义一个类 继承 IABC接口
/// </summary>
public class ABC : IABC
{
public void SayHi()
{
Console.WriteLine("Hello, .NET Core");
}
}2.注入自定义服务:public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IABC, ABC>(); //注入自定义服务
services.AddMvc(); //添加MVC服务
}3.MVC控制器Controller构造函数中入住:public class HomeController : Controller
{
IABC _abc; //自定义接口
public HomeController(IABC abc)
{
_abc = abc; //构造函数注入
}
public IActionResult Index()
{
_abc.SayHi(); //调用
return View();
}
}思考:假如在定义一个类继承上面自定义的接口IABC,并实现接口中的方法SayHi(),依次出入服务时,会有什么样的结果呢?///继承IABC并实现SayHi()
public class BCD : IABC
{
public void SayHi()
{
Console.WriteLine("Hello,BCD");
}
}依次在ConfigureServices()方法中注入服务:public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IABC, ABC>(); //注入自定义服务ABC
services.AddScoped<IABC, BCD>(); //注入自定义服务BCD
services.AddMvc(); //添加MVC服务
}结果:在MVC的Action方法Index中执行,会覆盖ABC中的内容,最终输出:Hello,BCD(备注:将SayHi方法void修改为string返回出值,定义变量接收,vs即时窗口中监视,此处为做修改,只做调试演示。)
思考:ABC和BCD都同是继承IABC接口,但ABC和BCD中的SayHi方法执行的内容不一致,如果就要执行指定类中的方法,该怎么修改呢?修改如下:public void ConfigureServices(IServiceCollection services)
{
//services.AddScoped<IABC, ABC>(); //注入自定义服务ABC
services.AddScoped(typeof(ABC)); //调整后,注意同上对比
//var abc = Activator.CreateInstance(typeof(ABC)) as ABC;
services.AddScoped<IABC, BCD>(); //注入自定义服务BCD
services.AddMvc(); //添加MVC服务
}
二、MVC的Action中可以用[FromServices]来注入放的对象;public IActionResult About([FromServices] ABC abc)
{
abc.SayHi();
ViewData["Message"] = "Your application description page.";
return View();
}当单个Action方法使用时,可以不用在整个Controller的构造函数中注入服务,减少HTTP请求(访问)生命周期。
)控制反转(IoC/Inverse Of Control): 调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
)依赖注入(DI/Dependence injection) : 容器创建好实例后再注入调用者称为依赖注入。
1、Startup类能够选择性地在构造函数中接受通过依赖注入提供的依赖项。Startup类必须定义一个Configure方法,可选择定义一个ConfigureServices方法,这些方法将在应用程序启动时被调用。
2、Configure方法用于指定ASP.NET应用程序将如何响应每一个HTTP请求。
注入服务Services:
AddTransient:每次调用范围,瞬态;
AddScoped:单次请求范围内,域内;
AddSingletion:整个应用范围,单例;
应用:
一、通过构造函数使用接口;
1.自定义接口服务:/// <summary>
/// 定义一个接口
/// </summary>
public interface IABC
{
void SayHi();
}
/// <summary>
/// 定义一个类 继承 IABC接口
/// </summary>
public class ABC : IABC
{
public void SayHi()
{
Console.WriteLine("Hello, .NET Core");
}
}2.注入自定义服务:public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IABC, ABC>(); //注入自定义服务
services.AddMvc(); //添加MVC服务
}3.MVC控制器Controller构造函数中入住:public class HomeController : Controller
{
IABC _abc; //自定义接口
public HomeController(IABC abc)
{
_abc = abc; //构造函数注入
}
public IActionResult Index()
{
_abc.SayHi(); //调用
return View();
}
}思考:假如在定义一个类继承上面自定义的接口IABC,并实现接口中的方法SayHi(),依次出入服务时,会有什么样的结果呢?///继承IABC并实现SayHi()
public class BCD : IABC
{
public void SayHi()
{
Console.WriteLine("Hello,BCD");
}
}依次在ConfigureServices()方法中注入服务:public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<IABC, ABC>(); //注入自定义服务ABC
services.AddScoped<IABC, BCD>(); //注入自定义服务BCD
services.AddMvc(); //添加MVC服务
}结果:在MVC的Action方法Index中执行,会覆盖ABC中的内容,最终输出:Hello,BCD(备注:将SayHi方法void修改为string返回出值,定义变量接收,vs即时窗口中监视,此处为做修改,只做调试演示。)
思考:ABC和BCD都同是继承IABC接口,但ABC和BCD中的SayHi方法执行的内容不一致,如果就要执行指定类中的方法,该怎么修改呢?修改如下:public void ConfigureServices(IServiceCollection services)
{
//services.AddScoped<IABC, ABC>(); //注入自定义服务ABC
services.AddScoped(typeof(ABC)); //调整后,注意同上对比
//var abc = Activator.CreateInstance(typeof(ABC)) as ABC;
services.AddScoped<IABC, BCD>(); //注入自定义服务BCD
services.AddMvc(); //添加MVC服务
}
public class HomeController : Controller { IABC _abc; public HomeController(ABC abc) { _abc = abc; } public IActionResult Index() { _abc.SayHi(); return View(); } }
二、MVC的Action中可以用[FromServices]来注入放的对象;public IActionResult About([FromServices] ABC abc)
{
abc.SayHi();
ViewData["Message"] = "Your application description page.";
return View();
}当单个Action方法使用时,可以不用在整个Controller的构造函数中注入服务,减少HTTP请求(访问)生命周期。
相关文章推荐
- Asp.net core 学习笔记 ( DI 依赖注入 )
- ASP.NET Core 2.0系列学习笔记-ORM框架之Dapper
- (7)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 利用Polly+AOP+依赖注入封装的降级框架
- ASP.NET Core 2.0系列学习笔记-NLog日志配置文件
- Asp.net core 学习笔记--(1)依赖注入
- ASP.NET Core 2.0系列学习笔记-Middleware中间件
- ASP.NET Core 2.0系列学习笔记-ADO.NET-MSSQLServerHelper
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
- ASP.NET Core 2.0系列学习笔记-配置文件
- ASP.NET Core 2 学习笔记(四)依赖注入
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入
- ASP.NET Core 2.0系列学习笔记-启动类Startup
- ASP.NET Core 2.0系列学习笔记-应用程序修改默认端口支持外网IP访问
- Asp.Net.Core 系列-中间件和依赖注入进阶篇
- 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
- 基础教程:视图中的ASP.NET Core 2.0 MVC依赖注入
- ASP.NET Core 2.0 依赖注入
- 学习ASP.NET Core,你必须了解无处不在的“依赖注入”
- ASP.NET Core 2.0 依赖注入
- 微软企业库5.0学习笔记(10)ASP.NET模块依赖注入