首页 > 其他分享 >.NET之默认依赖注入 注入方式(构造函数注入、FromServices操作注入)和 获取服务(Controller构造函数中注入获取、IServiceProvider获取、statrup中获取服务)

.NET之默认依赖注入 注入方式(构造函数注入、FromServices操作注入)和 获取服务(Controller构造函数中注入获取、IServiceProvider获取、statrup中获取服务)

时间:2023-11-13 19:57:36浏览次数:44  
标签:服务 获取 IUserService userService 注入 public 构造函数

.NET之默认依赖注入 注入方式(构造函数注入、FromServices操作注入)和 获取服务(Controller构造函数中注入获取、IServiceProvider获取、statrup中获取服务)

介绍

领券 https://www.cps3.cn/

不要依赖于具体的实现,应该依赖于抽象,高层模块不应该依赖于底层模块,二者应该依赖于抽象。简单的说就是为了更好的解耦。而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖注入(DI)。ASP.NET Core内置有对依赖注入(DI)的支持,开发者只需要定义好接口后,在Startup.cs的ConfigureServices方法里使用对应生命周期的绑定方法即可。

只要是用new实例化的都是存在依赖的。

生命周期

AddSingleton→AddTransient→AddScoped

Singleton(单例)

服务在第一次请求时被创建(或者当我们在ConfigureServices中指定创建某一实例并运行方法),其后的每次请求将沿用已创建服务。如果开发者的应用需要单例服务情景,请设计成允许服务容器来对服务生命周期进行操作,而不是手动实现单例设计模式然后由开发者在自定义类中进行操作。

image

图片来源自:https://blog.csdn.net/weixin_47498376/article/details/116177389

services.AddSingleton<IApplicationService,ApplicationService>

比如某些公共类等

Scoped(作用域)

一次请求开始到请求结束 ,这次请求中获取的对象都是同一个

image

图片来源自:https://blog.csdn.net/weixin_47498376/article/details/116177389

services.AddScoped<IApplicationService,ApplicationService>

如果该service在一个请求过程中多次被用到,并且可能共享其中的字段或者属性,那么就使用scoped,例如httpcontext (感谢群里老哥的帮助)

Transient(瞬时)

每一次获取的对象都不是同一个,它最好被用于轻量级无状态服务(如我们的Repository和ApplicationService服务)

image

图片来源自:https://blog.csdn.net/weixin_47498376/article/details/116177389

services.AddTransient<IApplicationService,ApplicationService>

如果该service在一次请求中只使用一次,那么就注册Transient就好了。

注入方式

  1. /// <summary>
  2. /// 用户接口
  3. /// </summary>
  4. public interface IUserService
  5. {
  6. string GetName();
  7. }
  8. /// <summary>
  9. /// 用户实现
  10. /// </summary>
  11. public class UserService : IUserService
  12. {
  13. public string GetName()
  14. {
  15. return "AZRNG";
  16. }
  17. }

需要在ConfigureServices方法进行注入

构造函数注入

服务作为构造函数参数添加,并且运行时从服务容器中解析服务。

  1. private readonly IUserService _userService;
  2. public UserController(IUserService userService)
  3. {
  4. _userService = userService;
  5. }
  6. [HttpGet]
  7. public ActionResult GetName()
  8. {
  9. return Ok(_userService.GetName());
  10. }

FromServices操作注入

  1. [HttpGet]
  2. public ActionResult GetName([FromServices] IUserService _userService)
  3. {
  4. return Ok(_userService.GetName());
  5. }

核心

在.NET Core中DI的核心分为两个组件:IServiceCollection和 IServiceProvider。

  • IServiceCollection负责注册
  • IServiceProvider负责提供实例
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //将服务生命期的范围限定为单个请求的生命期
  4. services.AddTransient<IUserService, UserService>();
  5. }

获取服务

  1. private readonly IUserService _userService;
  2. public HomeController(IUserService userService)
  3. {
  4. _userService = userService;
  5. }
  6. public IActionResult Index()
  7. {
  8. var info = _userService.GetInfo();
  9. return View();
  10. }

IServiceProvider获取

  1. private readonly IServiceProvider _service;
  2. public UserController(IServiceProvider service)
  3. {
  4. _service = service;
  5. }
  6. [HttpGet]
  7. public ActionResult GetName()
  8. {
  9. var _userService = (IUserService)_service.GetService(typeof(IUserService));
  10. return Ok(_userService.GetName());
  11. }

statrup中获取服务

  1. var provider = services.BuildServiceProvider();
  2. var userserivce = provider.GetService<IUserService>();
  3. //或
  4. var userservice2 = provider.GetRequiredService<IUserService>();

微信公众号

原文链接:https://blog.csdn.net/weixin_48967543/article/details/116528289

标签:服务,获取,IUserService,userService,注入,public,构造函数
From: https://www.cnblogs.com/sunny3158/p/17829987.html

相关文章

  • 解决input获取焦点,弹出输入法之后,input被遮挡的问题
    关于input输入框fixed在窗口底部的时候,input获取焦点,弹出输入法,input会被输入法遮挡,导致输入内容不方便。我们可以用scrollIntoView与scrollIntoViewIfNeeded来解决这个问题。scrollIntoView与scrollIntoViewIfNeeded都是让当前的元素滚动到浏览器窗口的可视区域内。关于scroll......
  • Teamcenter开发,时间表或者任务,如何获取子任务
    1、在胖客户端是看到对应子任务,是放在父任务的哪个属性的。2、你在胖客户端看父任务和子任务的关系,也是-1,所以这个就很奇怪了。 是这个属性 child_task_taglist 补充一下:时间表  和汇总任务的关系内码是:fnd0SummaryTask如果要获取时间表下面的子任务,不能通过时间......
  • AOP以注解为切入点,获取注解参数和切点方法参数名
    AOP以注解为切入点,获取注解参数和切点方法参数名importcn.lettin.base.response.ResponseObjBaseVo;importcn.lettin.base.response.ResponseVo;importcn.lettin.keeper.edge.utils.UserNodeAuthCheckUtils;importorg.aspectj.lang.ProceedingJoinPoint;importorg.asp......
  • 全志R128应用开发案例——获取真随机数
    获取真随机数本文案例代码下载地址获取真随机数案例代码https://www.aw-ol.com/downloads?cat=24R128内置了TRNG,一个真随机数发生器,随机源是8路独立的环形振荡器,由模拟器件电源噪声产生频率抖动,用低频始终重采样,然后进行弹性抽取和熵提取处理,最终输出128bit真随......
  • 苹果Ios系统app应用程序开发者如何获取IPA文件?签名证书时需要注意什么?
    大家好呀,我是咕噜签名分发可爱多。在 iOS应用程序开发中,签名过程是非常重要的一环。签名保证了应用的真实性和完整性,它也是让应用能在设备上运行的前置条件。苹果使用一系列证书和配置文件来管理这一过程。获取IPA文件签名证书是发布应用程序至AppStore的重要步骤之一。签名证书......
  • 如何修复视频汇聚平台EasyCVR衍生版视频融合平台EasyCVS设备录像时间获取异常
    我们目前正在EasyCVS管理平台的前端视频直播界面上进行优化工作。之前,我们已经分享了有关解决设备录像时间选择后不生效问题的优化方法。然而,在解决了该问题后,我们发现EasyCVS的时间选择功能仍存在一些问题。具体而言,EasyCVS的录像回放功能在时间选择上默认是查询前7天的录像数据......
  • JavaScript使用JS从JSON获取信息并遍历输出到网页展示信息------前端
    遍历JSON获取数据<!DOCTYPEhtml><!--这是HTML的注释--><htmllang="en"id="myHtml"> <head> <!--这里不是设置了编码,而是告诉浏览器,用什么编码方式打开文件避免乱码--> <metacharset="UTF-8"> <metaname="viewport"......
  • 虚幻5启动外部进程并获取所有输出的方法
    1intLaunchExternalProcess(constFString&InExecutablePath,constFString&InCommandArgument)2{3constboolbLaunchDetached=false;4constboolbLaunchHidden=true;5constboolbLaunchReallyHidden=true;67intRe......
  • 使用 Chrome 开发者工具获取网站的 LCP 数据
    LargestContentfulPaint(LCP)是一个重要的、用户感知性能的测量指标,它报告了在页面加载过程中,视口内最大可见元素呈现的时间。理想的LCP时间小于2.5秒。那么,我们如何使用Chrome浏览器来度量一个网站的LCP呢?下面是一个详细的步骤说明。首先,你需要打开你想要测试的网站。......
  • 怎么在window上自动获取crash dump
     保存如下内容到opendump.bat,已管理员权限打开文件@echooffecho正在启用Dump...regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsErrorReporting\LocalDumps"regadd"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\WindowsErrorReporting\Loc......