如何使用ServiceProvider构建ServiceCollection?

时间:2018-12-02 13:00:50

标签: c# dependency-injection

我正在使用此方法构建服务实现:

Sample image

我正在使用Microsoft.Extensions.DependencyInjection并试图实现以下目标:

  • 创建本地ServiceCollection,并保持原始ServiceProvider(和基础ServiceCollection)不变
  • 将当前类型(TViewModel)注册到本地ServiceCollection
  • 将父IServiceProvider(从另一个ServiceCollection构建)提供的所有服务添加到本地ServiceCollection。
  • 使用本地ServiceCollection创建本地ServiceProvider,该ServiceProvider可以提供我当前正在执行的类型的实例。

我在这里疯了吗?对我来说,我似乎在这里做些奇怪的事情,因为它不存在用于从另一个ServiceProvider初始化ServiceCollection的API。

注意

我不想在原始ServiceCollection上运行serviceCollection.AddX。

2 个答案:

答案 0 :(得分:3)

  

如何从ServiceProvider中构建ServiceCollection?

简短答案:您不能开箱即用

一旦构建了服务提供者,对服务集合的任何更改都不会对提供者产生影响。

最终构建的ServiceProvider类没有公开任何方法来获取用于构建它的集合。

如果对原始集合进行了修改,我建议您仅保留原始集合的参考,并根据需要构建新的提供程序。

否则,您将需要创建自己的IServiceProviderFactory<TContainerBuilder>

  

提供了一个扩展点,用于创建容器特定的构建器和一个IServiceProvider

具有您所需的功能。

答案 1 :(得分:0)

由于这会出现在 Google 搜索结果中,因此我将提供更新的答案。

现在可以通过将父 IServiceProvider 传递给 ServiceCollection 的构造函数来实现:

new ServiceCollection(serviceProvider)