Многократная реализация регистра DbContext в системе asp. net DI - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь зарегистрировать несколько реализаций DbContext как pnet основной DI

, поэтому я зарегистрировал DbContext ниже

services.AddScoped(c => new CoreDbContext(c.GetService<DbContextOptions<CoreDbContext>>()));
services.AddScoped(c => new TnADbContext(c.GetService<DbContextOptions<TnADbContext>>()));
services.AddScoped<Func<DbContextType, IDbContext>>(provider => key =>
{
    switch (key)
    {
        case DbContextType.Core:
            return provider.GetService<CoreDbContext>();
        case DbContextType.TnA:
            return provider.GetService<TnADbContext>();
        case DbContextType.Payroll:
            throw new ArgumentOutOfRangeException(nameof(key), key, null);
        default:
            throw new ArgumentOutOfRangeException(nameof(key), key, null);
    }
});

, поэтому из репозиториев я пытаюсь запросить экземпляр, подобный приведенному ниже : Web.Areas.TestController Время жизни: переходный тип реализации: Web.Areas.TestController ': невозможно разрешить службу для типа «Data.IDbContext» при попытке активировать «Service.InterfaceService».)

По существу почти все сервисы и контролеры жалуются на одну и ту же проблему. Так что же было недостающей частью?

ОБНОВЛЕНИЕ

На самом деле я внес некоторые изменения при регистрации контекста БД, теперь он работает

services.AddScoped<Func<DbContextType, IDbContext>>(provider => key =>
{
    switch (key)
    {
        case DbContextType.Core:
            return new CoreDbContext(provider.GetService<DbContextOptions<CoreDbContext>>());
        case DbContextType.TnA:
            return new TnADbContext(provider.GetService<DbContextOptions<TnADbContext>>());
        case DbContextType.Payroll:
            throw new ArgumentOutOfRangeException(nameof(key), key, null);
        default:
            throw new ArgumentOutOfRangeException(nameof(key), key, null);
    }
});

1 Ответ

0 голосов
/ 25 апреля 2020

Итак, я пришел к решению, регистрирующему Dbconfigs, как показано ниже

services.AddScoped<Func<DbContextType, IDbContext>>(provider => key =>
{
    switch (key)
    {
        case DbContextType.Core:
            return new CoreDbContext(provider.GetService<DbContextOptions<CoreDbContext>>());
        case DbContextType.TnA:
            return new TnADbContext(provider.GetService<DbContextOptions<TnADbContext>>());
        case DbContextType.Payroll:
            throw new ArgumentOutOfRangeException(nameof(key), key, null);
        default:
            throw new ArgumentOutOfRangeException(nameof(key), key, null);
    }
});

И убедитесь, что IDbContext не вводит какие-либо службы, вместо этого вы можете попробовать, как показано ниже

private readonly IDbContext _context;

public InterfaceService(Func<DbContextType, IDbContext> resolver)
{
    _context = resolver(DbContextType.TnA);
}

Тип DbContext будет перечисление, которое содержит тип контекста БД, который мне нужно ввести

...