【问题标题】:Using Unity DI with HostBuilder based .NET Core console application将 Unity DI 与基于 HostBuilder 的 .NET Core 控制台应用程序结合使用
【发布时间】:2019-12-03 18:12:09
【问题描述】:

使用 ASP.NET MVC Core,可以通过加载适当的 NuGet 包(Unity.Container 和 Unity.Microsoft.DependencyInjection)来使用 Unity DI 包,然后在构建 Web 主机时调用 UseUnityServiceProvider() 扩展方法Program.cs。此扩展方法基于IWebHostBuilder 接口。初始化主机后,可以通过 .NET Core GetService 接口和任何构造函数注入访问 Unity DI 功能。

我正在开发一个基于控制台的应用程序,它将使用HostBuilderIHostBuilder 接口。作为针对IHostBuilderConfigureServices() 方法调用的一部分,我尝试从UseUnityServiceProvider() 扩展(可在此处获得:https://github.com/unitycontainer/microsoft-dependency-injection/blob/master/src/HostingExtension.cs)重新实现注册逻辑,但服务提供者的更改似乎对下游不可见DI 调用。

有没有人成功让 Unity 在使用 HostBuilder 创建的应用程序中使用 Microsoft DI 方法?

更新根据要求,这是我正在尝试的示例(取自 Unity 源)。当然,这是行不通的。 TestService 有一个构造函数,它应该被注入在MyUnityExtension 中定义的对象。这不会发生。

private static async Task MainTest()
{
    var container = new UnityContainer().AddNewExtension<MyUnityExtension>();
    var factory = new ServiceProviderFactory(container);

    var hostBuilder = new HostBuilder()
        .ConfigureServices((hostBuilderContext, services) =>
        {
            services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IUnityContainer>>(factory));
            services.Replace(ServiceDescriptor.Singleton<IServiceProviderFactory<IServiceCollection>>(factory));

            services.AddHostedService<TestService>();
        });

    await hostBuilder.RunConsoleAsync();
}

【问题讨论】:

  • 如果您能分享minimal reproducible example 那就太好了,这样我们就可以更清楚地了解当前的问题以及您实际上想要做什么?

标签: dependency-injection .net-core unity-container


【解决方案1】:

不确定你想用new UnityContainer().AddNewExtension&lt;MyUnityExtension&gt;() 实现什么。

如果你只是想将一些注册的服务注入到TestService中,为什么不直接使用IUnityContainer.RegisterType&lt;TInterface, TImplementation&gt;()呢?

这是 Program.cs 中的有效 IHost 设置(.NET Core 3.1、Microsoft.Extensions.Hosting v3.10、Unity.Microsoft.DependencyInjection v5.11.5):

public static async Task Main(string[] args)
{
    var container = new UnityContainer();
    container.RegisterType<IService, MyService>();

    var builder = new HostBuilder()
      .ConfigureServices((hostContext, services) =>
      {
          services.AddHostedService<TestService>();
      })
      .ConfigureLogging((hostingContext, logging) =>
      {
          logging.AddConsole();
      })
      .UseUnityServiceProvider(container);
    await builder.RunConsoleAsync();
}

界面:

public interface IService
{
    string Name { get; }
}

实现:

public class MyService : IService
{
    public string Name => "My name";
}

TestService:

public class TestService : IHostedService
{
    private readonly IService service;
    private readonly ILogger logger;

    public TestService(IService service, ILogger<TestService> logger)
    {
        this.service = service;
        this.logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        this.logger.LogInformation("Hello {n}", this.service.Name);
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多