首页 > 解决方案 > 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;
        }
    }

标签: entity-framework.net-coredependency-injection

解决方案


看来我已经找到了阅读这篇文章的解决方案。我将 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);
        }
    }

推荐阅读