c# - 为什么 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()
因此当它的作用域被释放并在第二个作用域中重新创建时它应该被销毁。
解决方案
你的测试不正确。尽管您正在创建两个单独的范围,但实际上并没有使用它们。这是一个工作版本:
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
该方法来自范围本身。
推荐阅读
- azure - Azure API 管理网关读取多部分表单数据
- python - 如何将 pandas datetime64 转换为可以被 Django 识别为 DateField 的东西?
- r - 在 Google 地图上显示物业的位置
- gcc - Homebrew 链接失败,机器上已有不兼容的 i386 文件
- python - VPS 上的 python-selenium 脚本下载 pdf 文件
- python - 网络浏览器在键盘命令完成之前打开。我想等到键盘命令完成后再打开浏览器
- html - 在没有 *Ngfor 的情况下显示数据
- javascript - 寻找一种将粘贴按钮放在 textarea 占位符中的方法?(javascript)
- python - 将数据框导出到工作簿中的现有 Excel 工作表会破坏其他工作表中的数据透视切片器连接
- javascript - 如何在 JavaScript 中读取上传的文件