ang*_*son 5 c# .net-core dryioc microsoft.extensions.hosting
我有一些类库为我创建的应用程序提供服务,并且出于遗留原因,它们与DryIoc紧密绑定。也就是说,服务注册是紧密绑定的,而不是实际的服务。
如果可以的话,如果我不需要,我宁愿不只是更改该代码。
创建一个新的 ASP.NET MVC Core 应用程序,我可以通过更改 ConfigureServices 方法来使用 DryIoc,以返回一个IServiceProvider,如下所示:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddControllersAsServices();
var container = new Container().WithDependencyInjectionAdapter(services);
return container.ConfigureServiceProvider<CompositionRoot>();
}
Run Code Online (Sandbox Code Playgroud)
(这是来自记忆,所以可能不是 100% 正确,但这并不重要)
重要的变化是该void方法可以更改为返回一个IServiceProvider,它DryIoc可以为我提供。
但是,HostBuilder我想将其用于控制台应用程序、后台服务等。配置服务的方法不接受,IServiceProvider所以我不知道该怎么做。
重要的代码是这样的:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });
Run Code Online (Sandbox Code Playgroud)
ConfigureServices上面的方法有一个重载和一个扩展方法:
ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)ConfigureServices(this IHostBuilder hostBuilder, Action<IServiceCollection> configureDelegate)似乎没有任何规定可以在这方面为我提供返回或使用 aIServiceProvider或任何其他东西DryIoc。
这可能吗?有没有办法弥合差距?或者我是否只需要切换到使用 MicrosoftIServiceCollection来创建我的类库?由于它们在许多项目中使用,我不想仅仅因为在这个特定实例中看起来最简单而改变,但如果我必须这样做,我必须这样做。
@Nkosi提供了一个不正确的答案(但在 ASP.NET 应用程序的上下文中是正确的),并且评论线程引发了关于一种方法的讨论UseServiceProviderFactory,结果证明是解决方案,所以谢谢大家。
要使用,UseServiceProviderFactory我必须自己实现一个类,并将适当的 nuget 包引用添加到我的项目中。
以下是步骤:
DryIoc.dll(不出所料)的引用DryIoc.Microsoft.DependencyInjectionUseServiceProviderFactory原始代码如下所示:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });
Run Code Online (Sandbox Code Playgroud)
以下是要使用的内容:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
//////////////////// ADD THIS vvvvvvvv
.UseServiceProviderFactory(new DryIocServiceProviderFactory())
.ConfigureContainer<Container>((hostContext, container) =>
{
container.Register<...>();
})
//////////////////// ADD THIS ^^^^^^^^
.ConfigureLogging((hostingContext, logging) => { ... });
Run Code Online (Sandbox Code Playgroud)
然后提供以下实现DryIocServiceProviderFactory:
internal class DryIocServiceProviderFactory : IServiceProviderFactory<IContainer>
{
public IContainer CreateBuilder(IServiceCollection services)
=> new Container().WithDependencyInjectionAdapter(services);
public IServiceProvider CreateServiceProvider(IContainer containerBuilder)
=> containerBuilder.ConfigureServiceProvider<CompositionRoot>();
}
Run Code Online (Sandbox Code Playgroud)
CompositionRoot上面的类在配置期间解析,构造函数可用于配置容器。可以使用什么都不做的虚拟类。