在一个ASP.NET核心项目中,我有以下关于启动的内容:
services.AddDbContext<Context>(x => x.UseSqlServer(connectionString));
services.AddTransient<IValidationService, ValidationService>();
services.AddTransient<IValidator<Model>, ModelValidator>();ValidationService如下:
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如下:
public class ModelValidator : AbstractValidator<Model> {
public ModelValidator(Context context) {
// Some code using context
}
}当我将IValidationService注入控制器并将其用作:
List<Error> errors = await _validator.ValidateAsync(order); 我知道错误:
System.ObjectDisposedException:无法访问已释放的对象。造成此错误的一个常见原因是处理通过依赖项注入解决的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例。这可能发生在对上下文调用This (),或者将上下文包装在using语句中。如果您使用的是依赖注入,则应该让依赖注入容器负责处理上下文实例。对象名称:“上下文”。
知道为什么在ModelValidator中使用上下文时会出现此错误。
怎么解决这个问题?
更新
所以我把代码改为:
services.AddScoped<IValidationService, ValidationService>();
services.AddScoped<IValidator<Model>, ModelValidator>();但我也犯了同样的错误。
更新种子数据代码在启动上的配置方法
因此,关于配置方法,我有:
if (hostingEnvironment.IsDevelopment())
applicationBuilder.SeedData();SeedData扩展是:
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
}
}我遗漏了什么?
更新--一个可能的解决方案
将我的种子方法改为以下方法似乎是可行的:
using (IServiceScope scope =
_provider.GetRequiredService<IServiceScopeFactory>().CreateScope()) {
Context context = _provider.GetService<Context>();
// Insert data in database
}发布于 2020-05-31 15:21:28
我也遇到了一个类似的错误,后来我解决了这个问题。
我在不使用await的情况下调用异步方法。
旧码
var newUser = _repo.Register(newUserToCreate);做好修复
var newUser = await _repo.Register(newUserToCreate);https://stackoverflow.com/questions/38704025
复制相似问题