【问题标题】:How do you build a ServiceCollection out of a ServiceProvider?如何从 ServiceProvider 构建 ServiceCollection?
【发布时间】:2019-05-03 23:06:45
【问题描述】:

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

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

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

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

注意

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

【问题讨论】:

  • 这几乎肯定不是疯了。但是,当某些事情偏离常规时,通常有助于理解您尝试做的事情的原因。可能还有其他一些建议。

标签: c# dependency-injection


【解决方案1】:

如何从 ServiceProvider 构建 ServiceCollection?

简答:你不能开箱即用

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

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

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

否则你需要创建自己的IServiceProviderFactory<TContainerBuilder>

提供用于创建容器特定构建器和IServiceProvider 的扩展点。

拥有您想要的功能。

【讨论】:

  • 解释了为什么这如此困难 - 我将相应地制作原型并标记为答案。
【解决方案2】:

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

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

new ServiceCollection(serviceProvider).

【讨论】:

  • 我是not seeing这个构造函数(我很想这样做)
  • @PeterL 您运行的是哪个版本的 DotNet?我在 .Net Core 3.1 中看到了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2017-12-07
  • 2014-09-10
  • 2022-01-27
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多