Основная цель этой библиотеки — стандартизировать код, используемый для доступа к базе данных. Поэтому я создал класс BaseDbContext, который реализует класс DbContext EntityFramework.
Впоследствии я и разные разработчики должны реализовать мой BaseDbContext внутри наш собственный ApplicationDbContext.
В нашей среде у нас есть несколько баз данных, скажем, по одной на каждого пользователя.
Для каждого запроса пользователя мы нужно найти конкретную базу данных, а затем динамически создать DbContext.
Для этого я хочу зарегистрировать DbContextFactory, который создаст ApplicationDbContext для каждого запроса, получая соответствующую строку ConnectionString с помощью метода RetriveConnectionString.
Пока это довольно просто и выглядит следующим образом:
Код: Выделить всё
public static WebApplicationBuilder AddApplicationDbContextFactory(this WebApplicationBuilder builder) where TApplicationDbContext : BaseDbContext
{
builder.Services.AddDbContextFactory((serviceProvider, options) =>
{
builder.ConfigureDbContextOptions(options);
});
return builder;
}
Моя проблема заключается в том, что в той же библиотеке я также имеют различные классы, которые уже используют DbContext, например Repository или UnitOfWork.
ApplicationDbContext не существует при написании код библиотеки, поэтому этот код основан на классе BaseDbContext:
Код: Выделить всё
public class UnitOfWork(IDbContextFactory dbContextFactory) : IUnitOfWork
{
protected bool _disposed;
private readonly BaseDbContext _dbContext = dbContextFactory.CreateDbContext();
}
code> и UnitOfWork пытаются получить экземпляр IDbContextFactory, я получаю сообщение об ошибке, поскольку не зарегистрировал IDbContextFactory.
Я попробовал добавить это в свой метод:
Код: Выделить всё
public static WebApplicationBuilder AddApplicationDbContextFactory(this WebApplicationBuilder builder) where TApplicationDbContext : BaseDbContext
{
builder.Services.AddDbContextFactory((serviceProvider, options) =>
{
builder.ConfigureDbContextOptions(options);
});
builder.Services.AddScoped(typeof(IDbContextFactory), provider =>
{
return provider.CreateScope().ServiceProvider.GetRequiredService();
});
return builder;
}
'Объект типа 'Microsoft.EntityFrameworkCore.Internal.DbContextFactory[ ApplicationDbContext]' невозможно преобразовать в тип 'Microsoft.EntityFrameworkCore.IDbContextFactory[BaseDbContext]'.'
Как мне сделать так, чтобы мой репозиторий
code> и UnitOfWork могут использовать BaseDbContext при регистрации ApplicationDbContext?
ОБНОВЛЕНИЕ 1:
Как указано в комментариях, ошибка связана с преобразованием, а не с кастингом. Он происходит из DAO, который реализовал мой класс Repository.
Я изменил код следующим образом:
Код: Выделить всё
builder.Services.AddScoped(typeof(IDbContextFactory), provider =>
{
return (IDbContextFactory)provider.CreateScope().ServiceProvider.GetRequiredService();
});
System.InvalidCastException: 'Невозможно привести объект типа 'Microsoft .EntityFrameworkCore.Internal.DbContextFactory[ApplicationDbContext]' для ввода 'Microsoft.EntityFrameworkCore.IDbContextFactory[BaseDbContext]'.'
Это несколько удивительно, поскольку Параметр TContext IDbContextFactory является ковариантным.
Кроме того, возможно, стоит отметить, что он пытается привести Internal.DbContextFactory к IDbContextFactory< /код>.
Подробнее здесь: https://stackoverflow.com/questions/784 ... g-for-idbc