ASP.NET Core DI手动获取注入对象的方法

 更新时间:2018年11月03日 16:24:46   作者:田园里的蟋蟀  
这篇文章主要给大家介绍了关于ASP.NET Core DI手动获取注入对象的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

依赖注入简单介绍:

依赖注入(Dependency injection , DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术。将类用来执行其操作的这些对象以某种方式提供给该类,而不是直接实例化合作者或使用静态引用。

ASP.NET Core DI 一般使用构造函数注入获取对象,比如在ConfigureServices配置注入后,通过下面方式获取:

private IValueService _valueService;

public ValueController(IValueService valueService)
{
 _valueService = valueService;
}

那如果手动获取注入对象呢?

第一种获取方式(有时会获取不到,不推荐使用):

var services = new ServiceCollection();
var provider = services.BuildServiceProvider();

var _valueService = provider.GetService<IValueService>();

第二种获取方式(推荐使用):

public void Configure(IApplicationBuilder app)
{
 ServiceLocator.Instance = app.ApplicationServices;
}

public static class ServiceLocator
{
 public static IServiceProvider Instance { get; set; }
}


public void SomeRandomMethod()
{
 var valueService = ServiceLocator.Instance.GetService<IValueService>();

 // Do something with service
}

补充:需要注意的是,使用ServiceLocator.Instance.GetService<T>(); ,只能获取AddTransient和AddSingleton注入的对象,而不能获取AddScoped(请求生命周期内唯一)注入的对象,不是不能获取,而是获取的和构造函数获取的不是相同对象,也就是说获取的对象没有共享,使用场景比如IUnitOfWork。

那怎么手动获取请求生命周期内的注入对象呢?方法如下:

using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace Sample.Domain
{
 public class SampleDomainService : IDomainService
 {
  private IUnitOfWork _unitOfWork;

  public SampleDomainService(IHttpContextAccessor httpContextAccessor)
  {
   _unitOfWork = httpContextAccessor.HttpContext.RequestServices.GetService<IUnitOfWork>();
  }
 }
}

IHttpContextAccessor接口在Microsoft.AspNetCore.Http.AbstractionsNuget 程序包下。

参考资料:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • IP地址与整数之间的转换实现代码(asp.net)

    IP地址与整数之间的转换实现代码(asp.net)

    把这个整数转换成一个32位二进制数。从左到右,每8位进行一下分割,得到4段8位的二进制数,把这些二进制数转换成整数然后加上”。”就是这个ip地址了
    2012-09-09
  • asp.net core应用docke部署到centos7的全过程

    asp.net core应用docke部署到centos7的全过程

    这篇文章主要给大家介绍了关于asp.net core应用docke部署到centos7的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • .NET Core对象池的应用:扩展篇

    .NET Core对象池的应用:扩展篇

    本文主要讲解.NET Core对象池的池化集合、池化StringBuilder、ArrayPool<T>以及MemoryPool<T>,需要了解的小伙伴可以多学习这篇文章,相信可以帮助到你
    2021-09-09
  • asp.net 无刷新附件上传实现方法

    asp.net 无刷新附件上传实现方法

    一直以来附件上传都是个很郁闷的问题,刚开始是利用js添加input file 然后一起提交来实现多文件上传,在使用163邮箱的时候很是羡慕它的附件上传部分(选择完文件就提交,可以多个文件一起上传,而且还可以获取上传进度),这时就很想自己也写个那样的东西出来。
    2010-01-01
  • 详解asp.net core重新加载应用配置

    详解asp.net core重新加载应用配置

    这篇文章主要介绍了asp.net core重新加载应用配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • asp.net 读取配置文件方法

    asp.net 读取配置文件方法

    asp.net 读取配置文件方法,需要的朋友可以参考下。
    2011-12-12
  • 浅谈VS中的DataPager分页

    浅谈VS中的DataPager分页

    这篇文章主要介绍了浅谈VS中的DataPager分页的相关资料和示例,需要的朋友可以参考下
    2015-02-02
  • asp.net中资源文件的使用

    asp.net中资源文件的使用

    .Net是一个丰富的平台,在它的结构中,程序集Assembly是自我描述的安装单元,它可以只包括一个PE(可移植可执行)格式的Dll或exe文件,也可以由多个文件组成,例如资源、Dll和exe等
    2011-12-12
  • asp.net 点击按钮提交后使按钮变灰不可用

    asp.net 点击按钮提交后使按钮变灰不可用

    asp.net 点击按钮提交后使按钮变灰不可用的实现代码。
    2009-06-06
  • 某个aspx页面突然死了连日志也没有的解决方法

    某个aspx页面突然死了连日志也没有的解决方法

    某个aspx页面突然死了连日志也没有,朋友提醒event viewer里看看,果然错误在那里,有此情况的朋友可以参考下
    2013-08-08

最新评论