Повторное использование контроллеров и служб ASP.NET с иерархией DbContext - PullRequest
0 голосов
/ 26 октября 2019

Использование ASP.NET MVC с .NET Core 2.2.

У меня есть несколько похожих баз данных и иерархия DbContext, например:

public class BaseContext : DbContext {}
public class DerivedContext : BaseContext {}

У меня есть службы и контроллеры, которые должныработать с обоими DbContext:

public class MyService
{
    public MyService(BaseContext dbContext) {}
}
public class MyController : ControllerBase
{
    public MyController (BaseContext dbContext) {}
}

Я пытаюсь использовать их с производной базой данных следующим образом:

services.AddDbContext<DerivedContext>(x => ...);

Проблема заключается в том, что инжектор зависимостей не может разрешить параметры BaseContext,Как я могу зарегистрировать производный тип в контейнере внедрения зависимостей и предоставить его при запросе базового типа?

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Вы можете вручную зарегистрировать DeriverContext как BaseContext.

services.AddDbContext<DerivedContext>(x => ...);
services.AddScoped<BaseContext>(c => c.GetRequiredService<DerivedContext>());

Это похоже на работу прокси.

Вы также можете написать метод расширений для инкапсуляции регистрации контекста.

0 голосов
/ 26 октября 2019

Это невозможно для инжектора зависимостей, ему нужен конкретный уникальный тип или интерфейс, который может быть разрешен для конкретной службы. Для Сервиса вы можете использовать универсальный тип для установки типа контекста, используемого экземпляром сервиса. Но для этого также необходимо, чтобы вы регистрировали службу для каждого вида контекста один раз, и вы должны различать в каждом контроллере, какой тип службы вы хотите использовать.

Если у вас есть похожие базы данных, почему вы этого не делаетеповторно использовать контекст для них обоих. В чем разница между двумя контекстами?

Может быть, вам может быть интересно иметь несколько экземпляров одного контекста, в которых конфигурация отличается. Это было бы, вероятно, лучшим и самым чистым способом, потому что контроллер и сервисы не влияют на контекст. Я также использую это поведение для работы с базой данных с несколькими схемами, которые содержат точно такие же таблицы. Для примера посмотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...