Подтвердить что ты не робот

Общий репозиторий в ядре ASP.NET без отдельной строки AddScoped для каждой таблицы в Startup.cs?

У меня есть общий репозиторий в моем проекте. Рассмотрим следующий фрагмент контроллера

public class Lookup1Controller : Controller
{
    readonly MyDbContext _db;

    public Lookup1Controller(MyDbContext dataContext)
    {
        _db = dataContext;
    }

    public async Task<IActionResult> Index()
    {

        IGenericRepository<Lookup1> _repository = new GenericRepository<Lookup1>(_db);
        var lookup1s = await _repository.SelectAll();

        return  View(lookup1s);
    }

Я не вижу необходимости иметь ссылку на базу данных как в моем общем репозитории, так и в каждом из моих контроллеров.

Я реорганизую его:

public class Lookup1Controller : Controller
{
    private IGenericRepository<Lookup1> _repository;

    public Lookup1Controller(IGenericRepository<Lookup1> repository)
    {
        _repository = repository;
    }

    public async Task<IActionResult> Index()
    {
        var lookup1s = await _repository.SelectAll();

        return  View(lookup1s);
    }

}

который является намного более аккуратным и наилучшим вариантом ASP.NET 5 из того, что я читал. но я получаю следующую ошибку, если я получаю доступ к этому маршруту контроллера в своем браузере:

InvalidOperationException: Unable to resolve service for type 'MyProject.Data.IGenericRepository`1[MyProject.Models.Lookup1]' while attempting to activate 'MyProject.Controllers.Lookup1.

из-за того, что я не ввел GenericRepository для использования интерфейса.

Я добавляю к моей строке Startup.cs a AddScoped для каждой из моих таблиц в методе ConfigureServices

services.AddScoped<IGenericRepository<Lookup1>,GenericRepository<Lookup1>> ();
services.AddScoped<IGenericRepository<Lookup2>,GenericRepository<Lookup2>> ();
services.AddScoped<IGenericRepository<Lookup3>,GenericRepository<Lookup3>> ();
services.AddScoped<IGenericRepository<Lookup4>,GenericRepository<Lookup4>> ();
etc

чтобы мой код выполнялся без исключения исключения.

Однако моя база данных содержит около 100 простых таблиц поиска. Когда я смотрю выше 100 строк кода, он просто выглядит не так.

Это похоже на код копирования и вставки. Каждый раз, когда я добавляю новую таблицу, добавляя новую модель и контроллер с видом, мой код будет компилироваться без ошибок. Но если я запустил программу и перейду к этому представлению, я мог бы получить ошибку запуска контроллера, если бы забыл добавить строку AddScoped в мой Startup.cs. Не очень хорошо подходит для обслуживания.

Мой вопрос:

  • Действительно ли лучше всего иметь services.AddScoped для каждой таблицы поиска в методе ConfigureServices Startup.cs?

  • Это общий репозиторий, поэтому не существует способа написать эти 100 строк для копирования и вставки в одну строку?

  • Если нет, то каков наилучший способ сделать это с помощью моего кода?

4b9b3361

Ответ 1

Просто используйте нерегревательные регистрационные перегрузки (те, где вам нужно передать объекты Type). Затем укажите открытые общие типы ваших интерфейса и реализации:

services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));

В контроллере добавьте зависимость для репозитория определенного типа (закрытый общий тип)

public HomeController(IGenericRepository<Lookup1> repository)
{
    ...
}