【问题标题】:.Net Core Dependency Injection - replace dependency within a child scope.Net Core Dependency Injection - 在子范围内替换依赖项
【发布时间】:2019-10-11 10:52:17
【问题描述】:

我正在使用默认的 .Net Core DI (Microsoft.Extensions.DependencyInjection)。我需要解决用另一个实例替换特定依赖项的服务。在我的情况下,它是一个数据库连接,所以它不是一级依赖。目前我发现的唯一可行的解​​决方案是从头开始创建一个新的服务提供商,但这对我来说似乎是一个巨大的开销。有没有办法继承现有配置来替换单个接口实现? IServiceProviderIServiceScopeFactory 接口没有任何方法可以修改任何内容。

【问题讨论】:

  • 内置 DI 实现没有嵌套范围/子容器,但您可以轻松配置它以使用其他 DI 实现,例如 Autofac
  • 但是 .Asp.Net Core 本身以某种方式为每个新范围(请求)提供了一个特定的实现,如 HttpContext,因此即使使用内置 DI 也应该可以实现
  • 是的,因为这些是范围服务。但是,这里没有机会切换每个范围提供依赖项的方式。获取新实例的机制始终相同,在启动时定义。
  • 这说明 XY 问题。您要解决的实际问题是什么,因为这可能不是最好的方法。

标签: .net asp.net-core dependency-injection


【解决方案1】:

是的,你可以加入Autofac,然后做你想做的事。

那么您可以注入ILifetimeScope,而不是注入IServiceProvider 的实例。

它将允许您启动一个范围并仅为该范围替换一个实现,而无需触及任何其他内容。

using (var scope = _lifetimeScope.BeginScope(builder => builder.Register(_ => new MyClassThatRequiresAConnection(myConnectionString))))
{
  // this would resolve the latest registration of the class `MyClassThatRequiresAConnection`
   var myClass = scope.Resolve<MyClassThatRequiresAConnection>();
  // more code here ...
}

【讨论】:

  • 我想避免添加另一个 IoC 容器,特别是因为我正在将我的应用程序从 .Net Framework 移植到 .Net Core 并用默认的 MS 实现替换另一个 IoC (Unity)
  • 没有第三方容器是不可能的。 MS服务商水平很高。更深入的一切都需要第 3 方,而 Autofac 就是您想要做出的选择
  • 但是 .Asp.Net Core 本身以某种方式为每个新范围(请求)提供了一个特定的实现,如 HttpContext,因此即使使用内置 DI 也应该可以实现
  • 这是一个不同的概念,http 上下文在每个请求上都会发生变化。这就是为什么您可以将 IHttpContextAccessor 注册为单例并在控制器之外使用它的原因。
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2021-03-22
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多