我试图将测试添加到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()
注册时具有作用域的生存期,因此在其作用域被处置并在第二个作用域中重新创建时应销毁它。
答案 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
来自示波器本身。