【问题标题】:Get access to the IServiceProvider / container in .net core访问 .net 核心中的 IServiceProvider / 容器
【发布时间】:2017-07-10 20:08:24
【问题描述】:

我希望能够访问内置的 IoC 容器(IServiceProvider 我相信)。

我知道在代码中访问它通常是不好的做法,我们应该允许框架将所需的任何依赖项注入到控制器之类的东西中。

我对此的特殊应用是我正在使用另一个产品Hangfire。该框架实例化对象本身。为了将依赖项注入这些对象,您需要覆盖 JobActivator 类并在那里引用您自己的容器。

This 问题展示了如何为测试目的创建一个新容器,但我想访问我已经设置的容器,而不必复制它。使用 Autofac 等 DI 框架,您可以在添加所有服务后构建容器时访问容器。

谁能帮忙?

【问题讨论】:

  • 您的案例完全有效。有时您需要延迟或分派对象的创建,这意味着您需要回调“容器”。只要这个回调在Composition Root内部实现,就是absolutely fine

标签: c# .net-core dependency-injection


【解决方案1】:

您可以在配置阶段访问IServiceProvider app.ApplicationServices 或使用HttpContext.RequestServices。自定义 JobActivator 应如下所示:

public class AspNetCoreJobActivator : JobActivator
{
    private IServiceProvider _serviceProvider;

    public AspNetCoreJobActivator(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public AspNetCoreJobActivator(IHttpContextAccessor httpContextAccessor)
    {
        _serviceProvider = httpContextAccessor.HttpContext.RequestServices;
    }

    public AspNetCoreJobActivator(HttpContext context)
    {
        _serviceProvider = context.RequestServices;
    }

    public override object ActivateJob(Type type)
    {
        return _serviceProvider.GetService(type);
    }
}

Startup.cs 文件中:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
    GlobalConfiguration.Configuration.UseActivator(new AspNetCoreJobActivator(serviceProvider)); // or app.ApplicationServices
    var server = new Hangfire.BackgroundJobServer();

    app.UseMvcWithDefaultRoute();
}

【讨论】:

  • 谢谢。这就是我最终访问服务提供商的方式。我对 Hangfire 有不同的问题,但那是另一次了! :)
猜你喜欢
  • 2020-07-23
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 2018-10-09
  • 2022-06-28
相关资源
最近更新 更多