在ASP.NET Core应用程序中,我可以像这样通过DI注册DbContext
services.AddDbContext<Models.ShellDbContext>(options => options.UseNpgsql(connection));
Run Code Online (Sandbox Code Playgroud)
而知道它的生命周期是什么呢?
从这里https://github.com/aspnet/EntityFramework/blob/f33b76c0a070d08a191d67c09650f52c26e34052/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L140看起来它被配置为作用域,这意味着的DbContext实例在每次请求创建.
所以问题的第一部分是:它是真的,如果是,那么它的代价是多少?
第二部分是:如果我创建一个消耗DbContext的服务,并且打算由控制器使用,并且将有一个API来管理DB中的某些实体,它是否应该注册为Scoped?
在ASP.NET Core项目中,我在Startup上有以下内容:
services.AddDbContext<Context>(x => x.UseSqlServer(connectionString));
services.AddTransient<IValidationService, ValidationService>();
services.AddTransient<IValidator<Model>, ModelValidator>();
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
ModelValidator如下:
public class ModelValidator : AbstractValidator<Model> {
public ModelValidator(Context context) {
// Some code using context
}
}
Run Code Online (Sandbox Code Playgroud)
当我在控制器中注入IValidationService并将其用作:
List<Error> errors = await _validator.ValidateAsync(order);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
System.ObjectDisposedException:无法访问已处置的对象.此错误的常见原因是处理从依赖项注入解析的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例.如果您在上下文中调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况.如果使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例.对象名称:'上下文'.
知道为什么我在ModelValidator中使用Context时遇到此错误.
如何解决这个问题?
UPDATE …