В проекте ASP.NET Core при запуске происходит следующее:
services.AddDbContext(x => x.UseSqlServer(connectionString));
services.AddTransient();
services.AddTransient();
Служба проверки выглядит следующим образом:
public interface IValidationService {
Task ValidateAsync(T model);
}
public class ValidationService : IValidationService {
private readonly IServiceProvider _provider;
public ValidationService(IServiceProvider provider) {
_provider = provider;
}
public async Task ValidateAsync(T model) {
IValidator validator = _provider.GetRequiredService();
return await validator.ValidateAsync(model);
}
}
И ModelValidator выглядит следующим образом:
public class ModelValidator : AbstractValidator {
public ModelValidator(Context context) {
// Some code using context
}
}
Когда я внедряю IValidationService в контроллер и использую его как:
List errors = await _validator.ValidateAsync(order);
Я получаю сообщение об ошибке:
System.ObjectDisposeException: невозможно получить доступ к удаленному объект. Распространенной
причиной этой ошибки является удаление контекста, который был разрешен
в результате внедрения зависимостей, а затем попытка использовать тот же
экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы
вызываете Dispose() в контексте или помещаете контекст в оператор
using. Если вы используете внедрение зависимостей, вы должны
позволить контейнеру внедрения зависимостей позаботиться об удалении экземпляров контекста
. Имя объекта: «Контекст».
Есть идеи, почему у меня возникает эта ошибка при использовании контекста внутри ModelValidator.
Как это исправить?
ОБНОВЛЕНИЕ
Поэтому я изменил код на:
services.AddScoped();
services.AddScoped();
Но я получаю ту же ошибку...
ОБНОВЛЕНИЕ — код исходных данных внутри метода настройки при запуске
Итак, при настройке метода у меня есть:
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()) {
await context.Database.MigrateAsync();
// Insert data code
}
}
Что мне не хватает?
ОБНОВЛЕНИЕ – возможное решение
Изменение моего метода Seed на следующий, кажется, работает:
using (IServiceScope scope =
_provider.GetRequiredService().CreateScope()) {
Context context = _provider.GetService();
// Insert data in database
}
Подробнее здесь: https://stackoverflow.com/questions/387 ... -dbcontext
Невозможно получить доступ к удаленному объекту в ASP.NET Core при внедрении DbContext. ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение