【问题标题】:How can I inject same class with different Life Cycles on Asp.Net Core DI?如何在 Asp.Net Core DI 上注入具有不同生命周期的同一类?
【发布时间】:2017-12-01 14:22:19
【问题描述】:

过去,我使用 Unity Container 来解决我与 Asp.Net MVC 的依赖关系。现在我计划使用 Asp.Net Core DI 而不是 Unity,因为 Unity 目前没有与 Core 集成的可行方法,我试图找出注入同一类但使用的最佳方法不同的生命周期。

为什么?我的问题本身就来了,因为在单个实体框架上下文上运行的多个线程不是线程安全的,为了在另一个线程中执行单独的查询,我需要为每个线程实例创建一个单独的 DbContext 实例。 我使用 Unity 的策略是创建 2 个 UnityContainer,一个包含所有单例类,另一个创建每个请求的实例。因此,当我在单独的线程中创建第二个查询时,我只需通过每个请求创建的统一实例来解决它。

使用 Asp.Net Core 我想知道:

1- 解决我的问题的最佳方法是什么?

2- 如果我选择相同的策略,我想知道我怎样才能拥有相同的 Asp.Net Core DI 两次?也许将 CompositionRoot 模式应用于两个“容器”

3-如果我不选择我的策略,我可以使用哪种模式在同一个容器中解析具有不同生命周期的同一类的实例,以及分别解决它们的方法是什么?

【问题讨论】:

  • 我需要调查一下,但命名实例会起作用吗?这取决于您使用的 DI,因为我怀疑是否支持开箱即用。在简单的注射器中有这个:simpleinjector.readthedocs.io/en/latest/…
  • @AshleyMedway 是的,该功能取决于您使用的 DI,但正如链接所述,我想避免 GetByKey 不在我的架构中引入 ServiceLocator
  • “Unity 目前没有与 Core 集成的可行方式”。 This example project 展示了如何将 Unity 与 ASP.NET Core 集成。这里的谬误是你认为你需要一个适配器,但你不需要。

标签: c# asp.net-mvc dependency-injection asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

你的要求是不必要的,真的。

当您在 ASP .NET Core 应用程序的 StartUp 类中的 ConfigureServices(使用 services.AddDbContext<MyDbContext> 扩展方法)方法中添加 DbContext 时,默认情况下注册为使用 范围 生命周期。范围生命周期是解决您提到的线程安全问题所必需的。

当然,您可以通过传递一些附加参数来使用AddDbContext 覆盖它。或者,您可以自己注册上下文。但是,你为什么要(?)。

【讨论】:

  • 请阅读本节“了解范围生命周期”并给我您的意见wildermuth.com/2016/08/07/ASP-NET-Core-Dependency-Injection,即使这样我也面临同样的问题
  • 他描述的场景似乎与他想在StartUp类中使用上下文直接相关;做数据库播种。我仍然认为您不需要费心创建多个容器,除非您的应用程序非常复杂。围绕一个或多个上下文的作用域生命周期应该可以满足您的需要,没有问题。这就是我在我的 EF 相关项目中使用的,它工作正常。我唯一遇到的问题是,如果我无意中尝试将上下文注册为瞬态或单例(然后尝试 DB I/O 时会出现各种错误)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 2023-04-05
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2021-12-13
相关资源
最近更新 更多