.net core手动获取注入服务实例

本文介绍两种在.NET Core中实现依赖注入的方式,推荐使用Configure方法设置ServiceLocator实例,并提供手动获取请求生命周期内注入对象的方法。

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

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(); ,只能获取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>();
  }
 }
}
.NET 8中,完成IoC注入后,有多种方式可以获取注入实例。 ### 在控制器或服务中通过构造函数注入获取实例 这是最常见的方式,依赖注入容器会在创建类的实例时自动将所需的依赖项注入到构造函数中。示例如下: ```csharp // 定义接口 public interface IMyService { void DoSomething(); } // 实现接口 public class MyService : IMyService { public void DoSomething() { Console.WriteLine("Doing something..."); } } // 使用注入服务的控制器 public class MyController { private readonly IMyService _myService; public MyController(IMyService myService) { _myService = myService; } public void CallService() { _myService.DoSomething(); } } ``` 在上述代码中,`MyController`类的构造函数接收一个`IMyService`类型的参数,依赖注入容器会自动将`MyService`的实例注入进来,然后在`CallService`方法中就可以使用该实例了。 ### 在中间件中获取实例 在ASP.NET Core应用的中间件中,可以通过`HttpContext.RequestServices`来获取注入实例。示例如下: ```csharp public class MyMiddleware { private readonly RequestDelegate _next; public MyMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var myService = context.RequestServices.GetService<IMyService>(); if (myService != null) { myService.DoSomething(); } await _next(context); } } ``` 在`InvokeAsync`方法中,通过`context.RequestServices.GetService<IMyService>()`方法获取`IMyService`的实例。 ### 手动从`IServiceProvider`获取实例 在某些情况下,可能需要手动从`IServiceProvider`获取实例。示例如下: ```csharp var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient<IMyService, MyService>(); var serviceProvider = serviceCollection.BuildServiceProvider(); var myService = serviceProvider.GetService<IMyService>(); if (myService != null) { myService.DoSomething(); } ``` 这里先创建了一个`ServiceCollection`,注册了服务,然后构建了`ServiceProvider`,最后通过`GetService`方法获取`IMyService`的实例
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值