将Unity DI与基于HostBuilder的.NET Core控制台应用程序一起使用

问题描述 投票:0回答:1

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

我正在使用基于控制台的应用程序,它将使用IWebHostBuilderGetService界面。我已经尝试通过HostBuilder扩展名(在此处提供IHostBuilder)重新实现注册逻辑,作为对UseUnityServiceProvider()https://github.com/unitycontainer/microsoft-dependency-injection/blob/master/src/HostingExtension.cs方法调用的一部分,但是对下游的服务提供者的更改似乎不可见DI电话。

在使用ConfigureServices()创建的应用程序中,有没有人成功使Unity与Microsoft DI方法一起使用?

[Update根据要求,这是我尝试的示例(摘自Unity来源)。当然,这是行不通的。 IHostBuilder有一个构造函数,应将该构造函数注入HostBuilder中定义的对象。这不会发生。

TestService
dependency-injection .net-core unity-container
1个回答
0
投票
不确定MyUnityExtension要实现什么。

如果只想将某些注册服务注入TestService,为什么不只使用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(); }

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

new UnityContainer().AddNewExtension<MyUnityExtension>()

界面:

IUnityContainer.RegisterType<TInterface, TImplementation>()

实现:

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(); }

TestService:

public interface IService { string Name { get; } }

© www.soinside.com 2019 - 2024. All rights reserved.