【问题标题】:How to resolve service by service type using ServiceLocator?如何使用 ServiceLocator 按服务类型解析服务?
【发布时间】:2020-10-02 20:53:57
【问题描述】:

我正在使用这样的ServiceProvider.GetService<T>() 解析服务。但后来我发现 Resolving Scoped Services 在调用 ServiceProvider.GetService<T>() 方法时出现运行时错误,说在根提供程序中找不到服务。然后我发现像这样解决创建范围,

using (var scope = _serviceProvider.CreateScope())
{
   return scope.ServiceProvider.GetService<T>();
}

我想创建一个通用函数。但问题是我不知道何时使用服务提供者范围以及何时不使用服务提供者,因为我不知道服务生命周期类型(Scoped/Singleton)。 我如何创建这个通用函数来解决服务而不知道生命周期或解决生命周期问题?

【问题讨论】:

    标签: asp.net-core .net-core dependency-injection inversion-of-control ioc-container


    【解决方案1】:

    您不应该这样做除非有理由不按预期注入服务。你可以看看这里 (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1)

    此外,如果您在 ConfigureServices(..) 结束之前构建服务提供程序,可能会导致非常微妙的错误,很难跟踪。以下是关于What are the costs and possible side effects of calling BuildServiceProvider() in ConfigureServices()的更深入信息@

    说了这么多,你应该在 Startup.cs 的 ConfigureService(..) 方法中定义服务的生命周期

    services.AddSingleton<ISingletonService, SingletonService>();
    services.AddScoped<IScopedService, ScopedService>();
    

    当你调用这个逻辑时

    using (var scope = _serviceProvider.CreateScope())
    {
       return scope.ServiceProvider.GetService<T>();
    }
    

    ServiceProvider 本身使用 ConfigureServices 上的代码处理服务生命周期。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多