Внедрение сервисов в базовый класс контроллеров - PullRequest
4 голосов
/ 08 февраля 2012

Сценарий:

Приложение MVC3, которое использует инжектор конструктора для предоставления услуг для данного контроллера:

public class HomeController : BaseController
{
    private readonly IArticleService _articleService;

    public HomeController(IArticleService articleService)
    {
        _articleService = articleService;
    }

    public ActionResult Index()
    {
        // do stuff with services
        return View()
    }
}

Намерение:

У меня есть UserService, которыйизвлекает основные данные пользователя из Active Directory, которые я хочу использовать со всех моих контроллеров, с базового контроллера.

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

public class BaseController : Controller
{
    private readonly IUserService _userService;

    public BaseController(IUserService userService)
    {
        _userService = userService;
    }
}

Сам по себе он выглядит хорошо, но теперь конструктор в моем HomeController отключен, так какдля этого нужен : base() инициализатор.Проблема заключается в том, что базовый инициализатор не является параметром из-за внедрения UserService.

public HomeController(IArticleService articleService) : base(IUserService userService)

Приведенный выше код приводит к синтаксическим ошибкам.

Вопрос (ы):

Как правильно внедрить сервис в мой BaseController и инициализировать его из дочерних классов Controller (например, HomeController)?

Ответы [ 3 ]

12 голосов
/ 08 февраля 2012

Интерфейс пользовательского сервиса должен быть включен в аргументы конструктора дочерних контроллеров в дополнение к базовым аргументам инициализатора. Как это:

public class HomeController : BaseController
{
    private readonly IArticleService _articleService;

    public HomeController(IArticleService articleService, IUserService userService) : base(userService)
    {
        _articleService = articleService;
    }

    public ActionResult Index()
    {
        // do stuff with services
        return View()
    }
}

Примечание: , чтобы что-либо сделать с базовым контроллером UserService от унаследованных контроллеров, измените измененный доступ с private на protected.

4 голосов
/ 08 февраля 2012

Вам нужно добавить IUserService как Constructor Parameter и передать его в базовую реализацию. Если конфигурация Ninject Container действительна, этого должно быть достаточно:

public HomeController(IArticleService articleService, IUserService userService) :
       base(userService)
{

}
0 голосов
/ 08 февраля 2012

Самый простой способ внедрить сервисы (и другие зависимости) - это использовать контейнер IoC / DI.В ASP.NET MVC есть все, чтобы сделать это возможным, вот объяснение , как это сделать .

В любом случае, даже без DI вы можете создать свой собственный маленький IControllerActivator ивпрысните свои услуги туда, как вам удобно.

...