В проекте ASP.NET Core у меня есть следующее при запуске:
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: Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application.
This may occur is you are calling Dispose() on the context, or wrapping the context in a using statement.
If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.
Object name: 'Context'.
Любая идея, почему у меня возникает эта ошибка при использовании Context внутри ModelValidator.
Как это исправить?
UPDATE
Итак, я изменил код на:
services.AddScoped<IValidationService, ValidationService>();
services.AddScoped<IValidator<Model>, ModelValidator>();
Но я получаю ту же ошибку...
UPDATE - Код данных семян внутри Configure method при запуске
Итак, на Configure method у меня есть:
if (hostingEnvironment.IsDevelopment())
applicationBuilder.SeedData();
И расширение SeedData:
открытый статический класс 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
}
}
Что мне не хватает?
ОБНОВЛЕНИЕ - Возможное решение
Как мне кажется, работает мой метод Seed:
using (IServiceScope scope = _provider.GetRequiredService<IServiceScopeFactory>().CreateScope()) {
Context context = _provider.GetService<Context>();
// Insert data in database
}