.NET学习笔记之默认依赖注入

2025-05-29 0 75

介绍

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

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

生命周期

AddSingleton→AddTransient→AddScoped

Singleton(单例)

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

.NET学习笔记之默认依赖注入

services.AddSingleton<IApplicationService,ApplicationService>

比如某些公共类等

Scoped(作用域)

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

.NET学习笔记之默认依赖注入

services.AddScoped<IApplicationService,ApplicationService>

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

Transient(瞬时)

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

.NET学习笔记之默认依赖注入

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默认依赖注入内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://www.cnblogs.com/azrng/p/14743716.html

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 .NET学习笔记之默认依赖注入 https://www.kuaiidc.com/97187.html

相关文章

发表评论
暂无评论