首页 > 解决方案 > 为什么 DI 为两个不同的范围返回相同的 DbContext?

问题描述

我正在尝试向 ASP.NET Core 项目添加一个测试,其中在一个范围内创建一个对象,然后在另一个范围内读取。这是为了模拟用户在一个 POST 请求中创建一个对象,然后在另一个 GET 请求中读取它。但是,我无法正确模拟这种情况。

我的测试代码中有这个

SomeDbContext firstContext;
bool isSame;
using (var scope = someServiceProvider.CreateScope()) {
   firstContext = someServiceProvider.GetService<SomeDbContext>();
}

using (var scope = someServiceProvider.CreateScope()) {
   var secondContext = someServiceProvider.GetService<SomeDbContext>();
   isSame = firstContext == secondContext; //should be false, right?
}

我希望在上面的代码执行时isSame有一个值,false但实际上是true. 这是为什么?SomeDbContext注册时它的生命周期是作用域的,AddDbContext()因此当它的作用域被释放并在第二个作用域中重新创建时它应该被销毁。

标签: c#asp.net-coredependency-injection

解决方案


你的测试不正确。尽管您正在创建两个单独的范围,但实际上并没有使用它们。这是一个工作版本:

SomeDbContext firstContext;
bool isSame;
using (var scope = someServiceProvider.CreateScope()) {
   firstContext = scope.ServiceProvider.GetService<SomeDbContext>();
}

using (var scope = someServiceProvider.CreateScope()) {
   var secondContext = scope.ServiceProvider.GetService<SomeDbContext>();
   isSame = firstContext == secondContext; //should be false, right?
}

请注意如何scope.ServiceProvider使用而不是someServiceProvider在解析依赖项时使用。

我在文档中可以找到的最接近的是从 main 调用服务。尽管该示例显示了该Main方法,但它也演示了如何使用IServiceProvider该方法来自范围本身。


推荐阅读