.NET学习笔记之默认依赖注入
介绍
不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽象。简单的说就是为了更好的解耦。而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖注入(DI)。ASP.NET Core内置有对依赖注入(DI)的支持,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可。
只要是用new实例化的都是存在依赖的。
生命周期
AddSingleton→AddTransient→AddScoped
Singleton(单例)
服务在第一次请求时被创建(或者当我们在ConfigureServices中指定创建某一实例并运行方法),其后的每次请求将沿用已创建服务。如果开发者的应用需要单例服务情景,请设计成允许服务容器来对服务生命周期进行操作,而不是手动实现单例设计模式然后由开发者在自定义类中进行操作。
services.AddSingleton<IApplicationService,ApplicationService>
比如某些公共类等
Scoped(作用域)
一次请求开始到请求结束 ,这次请求中获取的对象都是同一个
services.AddScoped<IApplicationService,ApplicationService>
如果该service在一个请求过程中多次被用到,并且可能共享其中的字段或者属性,那么就使用scoped,例如httpcontext (感谢群里老哥的帮助)
Transient(瞬时)
每一次获取的对象都不是同一个,它最好被用于轻量级无状态服务(如我们的Repository和ApplicationService服务)
services.AddTransient<IApplicationService,ApplicationService>
如果该service在一次请求中只使用一次,那么就注册Transient就好了。
注入方式
/// <summary> /// 用户接口 /// </summary> public interface IUserService { string GetName(); } /// <summary> /// 用户实现 /// </summary> public class UserService : IUserService { public string GetName() { return "AZRNG"; } }
需要在ConfigureServices方法进行注入
构造函数注入
服务作为构造函数参数添加,并且运行时从服务容器中解析服务。
private readonly IUserService _userService; public UserController(IUserService userService) { _userService = userService; } [HttpGet] public ActionResult GetName() { return Ok(_userService.GetName()); } FromServices操作注入 [HttpGet] public ActionResult GetName([FromServices] IUserService _userService) { return Ok(_userService.GetName()); }
核心
在.NET Core中DI的核心分为两个组件IServiceCollection和 IServiceProvider。
- IServiceCollection负责注册
- IServiceProvider负责提供实例
public void ConfigureServices(IServiceCollection services) { //将服务生命期的范围限定为单个请求的生命期 services.AddTransient<IUserService, UserService>(); }
获取服务
private readonly IUserService _userService; public HomeController(IUserService userService) { _userService = userService; } public IActionResult Index() { var info = _userService.GetInfo(); return View(); }
IServiceProvider获取
private readonly IServiceProvider _service; public UserController(IServiceProvider service) { _service = service; } [HttpGet] public ActionResult GetName() { var _userService = (IUserService)_service.GetService(typeof(IUserService)); return Ok(_userService.GetName()); }
statrup中获取服务
var provider = services.BuildServiceProvider(); var userserivce = provider.GetService<IUserService>(); //或 var userservice2 = provider.GetRequiredService<IUserService>();
到此这篇关于.NET学习笔记之默认依赖注入的文章就介绍到这了,更多相关.NET默认依赖注入内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程