通过使用ASP.NET MVC核心,可以通过加载适当的NuGet包(Unity.Container和Unity.Microsoft.DependencyInjection),然后在Program.cs
中构建web主机时调用UseUnityServiceProvider()
扩展方法来使用Unity包。此扩展方法基于IWebHostBuilder
接口。初始化主机后,可以通过.NET核心GetService
接口和任何构造函数注入访问Unity功能。
我正在开发一个基于控制台的应用程序,它将使用HostBuilder
和IHostBuilder
接口。我尝试过从UseUnityServiceProvider()
扩展(这里有:https://github.com/unitycontainer/microsoft-dependency-injection/blob/master/src/HostingExtension.cs)重新实现注册逻辑,作为针对IHostBuilder
的ConfigureServices()
方法调用的一部分,但是服务提供者的更改似乎在下游DI调用中不可见。
是否有人成功地在使用HostBuilder
创建的应用程序中使用Microsoft方法?
根据请求更新,这里是我正在尝试的一个示例(取自统一源)。当然,这是行不通的。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();
}
发布于 2020-01-05 08:12:19
不确定您想用new UnityContainer().AddNewExtension<MyUnityExtension>()
实现什么。
如果您只想将一些注册服务注入TestService,为什么不直接使用IUnityContainer.RegisterType<TInterface, TImplementation>()
呢?
下面是IHost在Program.cs中的工作设置(.NET Core3.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;
}
https://stackoverflow.com/questions/59163036
复制相似问题