У меня есть общий репозиторий в моем проекте. Рассмотрим следующий фрагмент контроллера
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 строк для копирования и вставки в одну строку?
-
Если нет, то каков наилучший способ сделать это с помощью моего кода?