首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >注入ASP.NET时无法访问DbContext内核中已释放的对象

注入ASP.NET时无法访问DbContext内核中已释放的对象
EN

Stack Overflow用户
提问于 2016-08-01 16:44:49
回答 11查看 116.1K关注 0票数 47

在一个ASP.NET核心项目中,我有以下关于启动的内容:

代码语言:javascript
运行
复制
  services.AddDbContext<Context>(x => x.UseSqlServer(connectionString));

  services.AddTransient<IValidationService, ValidationService>();

  services.AddTransient<IValidator<Model>, ModelValidator>();

ValidationService如下:

代码语言:javascript
运行
复制
public interface IValidationService {
    Task<List<Error>> ValidateAsync<T>(T model);
}

public class ValidationService : IValidationService {
    private readonly IServiceProvider _provider;

    public ValidationService(IServiceProvider provider) {
        _provider = provider;
    }

    public async Task<List<Error>> ValidateAsync<T>(T model) {
        IValidator<T> validator = _provider.GetRequiredService<IValidator<T>>();

        return await validator.ValidateAsync(model);
    }
}

ModelValidator如下:

代码语言:javascript
运行
复制
public class ModelValidator : AbstractValidator<Model> {
  public ModelValidator(Context context) {
    // Some code using context
  }
}

当我将IValidationService注入控制器并将其用作:

代码语言:javascript
运行
复制
List<Error> errors = await _validator.ValidateAsync(order);    

我知道错误:

System.ObjectDisposedException:无法访问已释放的对象。造成此错误的一个常见原因是处理通过依赖项注入解决的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。这可能发生在对上下文调用This (),或者将上下文包装在using语句中。如果您使用的是依赖注入,则应该让依赖注入容器负责处理上下文实例。对象名称:“上下文”。

知道为什么在ModelValidator中使用上下文时会出现此错误。

怎么解决这个问题?

更新

所以我把代码改为:

代码语言:javascript
运行
复制
services.AddScoped<IValidationService, ValidationService>();

services.AddScoped<IValidator<Model>, ModelValidator>();

但我也犯了同样的错误。

更新种子数据代码在启动上的配置方法

因此,关于配置方法,我有:

代码语言:javascript
运行
复制
if (hostingEnvironment.IsDevelopment())
  applicationBuilder.SeedData();

SeedData扩展是:

代码语言:javascript
运行
复制
public static class DataSeedExtensions {
    private static IServiceProvider _provider;

    public static void SeedData(this IApplicationBuilder builder) { 
        _provider = builder.ApplicationServices;
        _type = type;

        using (Context context = (Context)_provider.GetService<Context>()) {
            await context.Database.MigrateAsync();
            // Insert data code
    }
}

我遗漏了什么?

更新--一个可能的解决方案

将我的种子方法改为以下方法似乎是可行的:

代码语言:javascript
运行
复制
using (IServiceScope scope = 
    _provider.GetRequiredService<IServiceScopeFactory>().CreateScope()) {
    Context context = _provider.GetService<Context>();
    // Insert data in database
}
EN

Stack Overflow用户

发布于 2020-05-31 15:21:28

我也遇到了一个类似的错误,后来我解决了这个问题。

我在不使用await的情况下调用异步方法。

旧码

代码语言:javascript
运行
复制
var newUser = _repo.Register(newUserToCreate);

做好修复

代码语言:javascript
运行
复制
var newUser = await _repo.Register(newUserToCreate);
票数 -1
EN
查看全部 11 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38704025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档