entity-framework - Databasecontext 被释放 - 自定义(嵌套)服务
问题描述
我尝试在 Startup.cs 中使用 services.AddDbContext 注入我的 DbContext。它被注入需要处理对数据库的每次调用的服务中。此 AzureService 被注入到实际需要数据的其他服务中。但是,当我尝试这个时,我总是在 AzureService 中的 de DbContext 上得到一个 system.ObjectDiposedException。
当我将它直接注入到 CompareService 中时,它就可以工作了,所以我可能在嵌套服务上犯了一个严重的错误。非常感谢帮助/见解。
代码:
启动.cs
services.AddDbContext<SchoolDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SchoolSyncDb")));
services.AddScoped<IAzureService, AzureService>();
services.AddScoped<ICompareService, CompareService>();
Azure服务
public class AzureService : IAzureService
{
private SchoolDbContext schoolDbContext;
private IMapper mapper;
private IHelperService helperSrv;
public AzureService(SchoolDbContext _sdb, IMapper _mapper, IHelperService _helper)
{
schoolDbContext = _sdb;
mapper = _mapper;
helperSrv = _helper;
}
比较服务
public class CompareService: ICompareService
{
private readonly IWisaService wisaSrv;
private readonly ISmartschoolService smtSrv;
private readonly IAzureService azureSrv;
private readonly IHelperService helperSrv;
private readonly ILoggerService loggerSrv;
public CompareService(IWisaService _ws, ILoggerService _ls, ISmartschoolService _ss, IAzureService _as, IHelperService _hs)
{
wisaSrv = _ws;
smtSrv = _ss;
azureSrv = _as;
helperSrv = _hs;
loggerSrv = _ls;
}
尝试从 CompareService 中的 AzureService 获取数据失败,因为 AzureService 中的 DbContext 已处置。
List<AdbStudentModels> DbList;
try
{
DbList = azureSrv.GetAllStudentInDbBySchool(school);
}
在 Azure 服务中
public List<AdbStudentModels> GetAllStudentInDbBySchool(string school)
{
try
{
return schoolDbContext.AdbStudentModels.Where(i => i.School.Schoolnaam.Equals(school)).ToList();
}
catch (Exception ex)
{
throw ex;
}
}
解决方案
看来我已经找到了阅读这篇文章的解决方案。我将 CompareService 的生命周期更改为单例,并将 AzureService 的生命周期更改为瞬态。
我仍然将 AzureService 注入到 CompareService 中,但我没有将 DbContext 注入到 azureService 中,而是将 IServiceprovider 作为一个整体注入并为 DbContext 创建一个范围。
我绝不是专业的程序员,所以我并没有声称这是解决方案或正确实现它的方法。它只是做我目前需要的。
启动.cs
services.AddDbContext<SchoolDbContext>(options => options.UseSqlServer(connString));
services.AddTransient<IAzureService, AzureService>();
services.AddSingleton<ICompareService, CompareService>();
比较服务
private readonly IAzureService azureSrv;
public CompareService(IAzureService _as)
{
azureSrv = _as;
}
Azure服务
private IServiceProvider sp;
public AzureService(IServiceProvider _sp)
{
sp = _sp;
}
AzureService 中需要 DbContext 的方法(使用范围)
public List<AdbStudentModels> GetAllStudentInDbBySchool(string school)
{
try
{
using (var scope = sp.CreateScope())
{
SchoolDbContext db = scope.ServiceProvider.GetRequiredService<SchoolDbContext>();
return db.AdbStudentModels.Where(i => i.School.Schoolnaam.Equals(school)).ToList();
}
}
catch (Exception ex)
{
throw new Exception("GetAllStudentInDbBySchool" + " / " + ex);
}
}
推荐阅读
- ibm-odm - 将规则项目从 IBM ODM 8.5 迁移到 8.9v
- ansible - 获得 ansible 等待 ssh 连接
- java - groovysh 给出调用目标异常
- javascript - 将数据从函数返回到 ajax javascript
- python - 客户端未从服务器 python 接收数据
- linux - cpu时间在虚拟机中跳跃很多
- highcharts - Highstock 设置 XAxis 极端没有数据
- spring - 初始化 List 的最佳实践?自动装配列表或构造函数初始化?
- amazon-web-services - 尽管输入了准确的话语,AWS Lex 仍匹配错误的意图
- javascript - ScrollIntoView() 不起作用 - vanilla JS,为什么?