У меня есть базовый контроллер в моем проекте MVC 5, который реализует некоторые общие функции. Эта функциональность требует определенных зависимостей. Я использую Unity 3, чтобы внедрить эти реализации в мои контроллеры, шаблон, который работал нормально, пока я не переключил свои контроллеры на наследование с этого базового контроллера. Теперь я столкнулся с следующей проблемой:
public class BaseController : Controller
{
private readonly IService _service;
public BaseController(IService service)
{
_service = service;
}
}
public class ChildController : BaseController
{
private readonly IDifferentService _differentService;
public ChildController(IDifferentService differentService)
{
_differentService = differentService;
}
}
'BaseController' does not contain a constructor that takes 0 arguments
что ошибка 'BaseController' does not contain a constructor that takes 0 arguments
. Unity не разрешает построение BaseController, поэтому он не может вставлять в него зависимостей. Я вижу два очевидных способа решения этой проблемы:
1.) Явным образом вызовите BaseController ctor и попросите каждого ChildController ctor ввести зависимости BaseController
public class ChildController : BaseController
{
private readonly IDifferentService _differentService;
public ChildController(IDifferentService differentService,
IService baseService)
: base(baseService)
{
_differentService = differentService;
}
}
Мне не нравится этот подход по нескольким причинам: один из них, потому что ChildControllers не используют дополнительные зависимости (поэтому он вызывает раздутие конструктора в дочерних контроллерах без причины) и, что более важно, если я когда-либо меняю подпись конструктора базового контроллера, я должен изменить сигнатуры конструктора каждого дочернего контроллера.
2.) Внедрение зависимостей BaseController посредством вставки свойств
public class BaseController : Controller
{
[Dependency]
public IService Service { get; set; }
public BaseController() { }
}
Мне нравится этот подход лучше - я не использую никаких зависимостей в коде конструктора BaseController, но это делает стратегию инъекций зависимостей кода непоследовательной, что тоже не идеально.
Вероятно, есть еще лучший подход, который включает в себя какую-то функцию разрешения зависимостей BaseController, которая требует контейнера Unity для сортировки сигнатуры метода ctor, но прежде чем я начну писать что-либо слишком, мне было интересно, разрешил ли кто-нибудь эту проблему раньше? Я нашел несколько решений, плавающих в Интернете, но они были обходными решениями, такими как Service Locator, которые я не хочу использовать.
Благодарю!