如何在Asp.Net Core DI中为不同的生命周期注入相同的类?

时间:2017-12-01 14:22:19

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

过去,我使用Unity Container来解析我与Asp.Net MVC的依赖关系。现在我打算使用Asp.Net Core DI而不是Unity,目前还没有可行的方式与Core集成,我想弄清楚哪个是注入同一个类的最佳方法但是不同的生命周期。

为什么呢?我的问题本身即将到来,因为在单个Entity Framework上下文中运行的多个线程不是线程安全的,并且为了在另一个线程中执行单独的查询,我需要为每个线程实例创建一个单独的DbContext实例。 我使用Unity的策略是创建2个UnityContainers,一个包含所有单例类,另一个创建每个请求的实例。因此,当我在一个单独的线程中创建第二个查询时,我只需通过每个请求创建的unity实例来解析它。

使用Asp.Net Core我想知道:

1-哪个是解决问题的最佳方法?

2-如果我选择相同的策略,我想知道如何两次使用相同的Asp.Net Core DI?可能会将CompositionRoot模式应用于两个“容器”

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

1 个答案:

答案 0 :(得分:1)

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

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

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