为什么DI为两个不同的范围返回相同的DbContext?

时间:2019-07-28 14:27:18

标签: c# asp.net-core entity-framework-core

我试图将测试添加到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。这是为什么? SomeDbContextAddDbContext()注册时具有作用域的生存期,因此在其作用域被处置并在第二个作用域中重新创建时应销毁它。

1 个答案:

答案 0 :(得分:6)

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

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

我在文档中找到的最接近的东西是Call services from main。尽管该示例显示了Main方法,但它也演示了如何使用IServiceProvider来自示波器本身。