Внедрить IDbContextFactory в конструктор, ожидающий IDbContextFactoryC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Внедрить IDbContextFactory в конструктор, ожидающий IDbContextFactory

Сообщение Anonymous »

Я разрабатываю базовую библиотеку Asp.Net, предназначенную для использования в различных микросервисах в моей среде.
Основная цель этой библиотеки — стандартизировать код, используемый для доступа к базе данных. Поэтому я создал класс 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;
}
Метод ConfigureDbContextOptions вызывает ранее упомянутый RetrieveConnectionString.
Моя проблема заключается в том, что в той же библиотеке я также имеют различные классы, которые уже используют DbContext, например Repository или UnitOfWork.
ApplicationDbContext не существует при написании код библиотеки, поэтому этот код основан на классе BaseDbContext:

Код: Выделить всё

public class UnitOfWork(IDbContextFactory dbContextFactory) : IUnitOfWork
{
protected bool _disposed;
private readonly BaseDbContext _dbContext = dbContextFactory.CreateDbContext();
}
Моя проблема в том, что, хотя наши будущие классы ApplicationDbContext реализуют BaseDbContext, и я регистрирую IDbContextFactory, когда репозиторий
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»