【发布时间】:2018-08-16 08:14:05
【问题描述】:
我有一些类库为我创建的应用程序提供服务,并且由于遗留原因,它们与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>();
}
(这是凭记忆,所以可能不是 100% 正确,但这并不重要)
重要的变化是void 方法可以更改为返回IServiceProvider,DryIoc 可以提供给我。
但是,对于我想用于控制台应用程序、后台服务等的HostBuilder,配置服务的方法不接受IServiceProvider,所以我不知道该怎么做。
重要的代码是这样的:
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostingContext, config) => { ... })
.ConfigureServices((hostContext, services) =>
{
services.AddOptions();
// configure services
})
.ConfigureLogging((hostingContext, logging) => { ... });
上面的ConfigureServices 方法有一个重载和一个扩展方法:
ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate)ConfigureServices(this IHostBuilder hostBuilder, Action<IServiceCollection> configureDelegate)
似乎没有任何规定可以返回或使用IServiceProvider 或DryIoc 在这方面可以为我提供的任何其他东西。
这可能吗?有没有办法弥合差距?还是我只需要切换到使用 Microsoft IServiceCollection 来为我的类库?由于它们已在许多项目中使用,我宁愿不要仅仅因为在这种特定情况下看起来最简单而进行更改,但如果必须,我必须这样做。
【问题讨论】:
标签: c# .net-core dryioc microsoft.extensions.hosting