C# 如何在Asp.NETCoreDI上注入具有不同生命周期的同一类?

C# 如何在Asp.NETCoreDI上注入具有不同生命周期的同一类?,c#,asp.net-mvc,dependency-injection,asp.net-core-mvc,asp.net-core-2.0,C#,Asp.net Mvc,Dependency Injection,Asp.net Core Mvc,Asp.net Core 2.0,过去,我使用Unity容器来解决与Asp.NETMVC的依赖关系。现在我计划使用Asp.NETCoreDI而不是Unity,因为Unity目前还没有一种与Core集成的可行方法,我正试图找出哪种方法是注入相同类但具有不同生命周期的最佳方法 为什么??我的问题本身就来了,因为在单个实体框架上下文上操作的多个线程不是线程安全的,为了在另一个线程中执行单独的查询,我需要为每个线程实例提供单独的DbContext实例。 我的Unity策略是创建2个UnityContainer,一个包含所有单例类,另一个

过去,我使用Unity容器来解决与Asp.NETMVC的依赖关系。现在我计划使用Asp.NETCoreDI而不是Unity,因为Unity目前还没有一种与Core集成的可行方法,我正试图找出哪种方法是注入相同类但具有不同生命周期的最佳方法

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

对于Asp.Net Core,我想知道:

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

2-如果我选择相同的策略,我想知道如何让同一个Asp.Net核心DI重复两次?可能会对两个“容器”应用CompositionRoot模式


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

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

当您在ASP.NET核心应用程序的
StartUp
类中的
ConfigureServices
中添加
DbContext
(使用
services.AddDbContext
扩展方法)方法时,默认情况下,将注册为具有作用域生存期的方法。要绕过您提到的线程安全问题,需要使用限定范围的生存期


当然,您可以通过传递一些额外的参数,用
AddDbContext
覆盖这个选项。或者,您可以自己注册上下文。但是,为什么您要(?)。

我需要研究它,但命名实例是否有效?这取决于您正在使用的DI,因为我怀疑它是否得到了开箱即用的支持。在simple injector中有这样一条:@AshleyMedway是的,该功能取决于您使用的DI,但正如链接所说,我希望避免使用GetByKey,以免在我的体系结构中引入ServiceLocator“Unity,它目前没有一种与Core集成的可行方法”。演示如何将Unity与ASP.NET核心集成。这里的谬误是你认为你需要一个适配器,但你不需要。请阅读“理解作用域生命周期”这一节,并给出你的意见,似乎即使这样我也面临同样的问题。他描述的场景似乎与他想在
启动
类中使用上下文这一事实直接相关;进行数据库种子设定。我仍然不认为您需要经历创建多个容器的麻烦,除非您的应用程序非常复杂。围绕一个或多个上下文的作用域生存期应该做您需要的事情,没有问题。这就是我在EF相关项目中使用的方法,而且效果很好。我唯一遇到问题的时候是,如果我无意中尝试将上下文注册为瞬态或单例(在尝试DB I/O时会出现各种错误)。