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

2025-05-29 0 70

依赖注入简单介绍:

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

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

?

1

2

3

4

5

6
private IValueService _valueService;

public ValueController(IValueService valueService)

{

_valueService = valueService;

}

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

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

?

1

2

3

4
var services = new ServiceCollection();

var provider = services.BuildServiceProvider();

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

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17
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。

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
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 程序包下。

参考资料:

  • Accessing IServiceProvider in static context
  • No way to get scope for current http request (Autofac 4)?

总结

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

原文链接:https://www.cnblogs.com/xishuai/p/asp-net-core-ioc-di-get-service.html

收藏 (0) 打赏

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

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

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

快网idc优惠网 建站教程 ASP.NET Core DI手动获取注入对象的方法 https://www.kuaiidc.com/98189.html

相关文章

发表评论
暂无评论