使用ASP.NET MVC Core,可以通过加载适当的NuGet程序包(Unity.Container和Unity.Microsoft.DependencyInjection)来使用Unity DI程序包,然后在[ C0]。此扩展方法基于UseUnityServiceProvider()
接口。初始化主机后,可以通过.NET Core Program.cs
接口和任何构造函数注入访问Unity DI功能。
我正在使用基于控制台的应用程序,它将使用IWebHostBuilder
和GetService
界面。我已经尝试通过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
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; } }