В моем решении ASP.NET Core MVC 6 у меня есть два набора контроллеров. Один набор содержит веб-страницы с их обычными видами. Другой набор содержит контроллеры API.
Чтобы избежать дублирования логики db, веб-контроллеры используют контроллеры API. В настоящее время я создаю экземпляр требуемого контроллера вручную, передавая ему DbContext в качестве аргумента конструктора. Это DbContext, заданный веб-контроллеру путем инъекции зависимостей.
Но всякий раз, когда я добавляю другой конструктор в контроллер API, мне нужно изменить все веб-контроллеры, которые используют этот контроллер API.
Как я могу использовать систему впрыска зависимостей, встроенную в ASP.Net 5, для создания экземпляра требуемого контроллера API для меня? Затем он автоматически заполнит требуемые параметры конструктора.
Одним из решений может быть перемещение логики db из контроллеров API на отдельный уровень и вызов из API и веб-контроллеров. Это не решило бы мою проблему, так как новый слой по-прежнему будет иметь одни и те же параметры, и я не поклонник ненужной проводки.
Другим решением было бы, чтобы веб-контроллеры обращались к API через веб-вызов, но это просто добавляет сложности в приложение.
Сегодня я делаю это:
public IActionResult Index()
{
using (var foobarController = new Areas.Api.Controllers.FoobarController(
// All of these has to be in the constructor of this controller so they can be passed on to the ctor of api controller
_dbContext, _appEnvironment,
_userManager, _roleManager,
_emailSender, _smsSender))
{
var model = new IndexViewModel();
model.Foo = foobarController.List(new FoobarRequest() { Foo = true, Bar = false });
model.Bar = foobarController.List(new FoobarRequest() { Foo = false, Bar = true });
return View(model);
}
}
И я надеюсь на что-то вроде этого: (Этот пример не работает.)
using (var foobarController = CallContextServiceLocator.Locator.ServiceProvider.GetService<Areas.Api.Controllers.FoobarController>())
{
var model = new IndexViewModel();
model.Foo = foobarController.List(new FoobarRequest() { Foo = true, Bar = false });
model.Bar = foobarController.List(new FoobarRequest() { Foo = false, Bar = true });
return View(model);
}