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

У меня есть BaseController, унаследованный другими контроллерами,

Базовый контроллер:

public partial class BaseController : Controller
{
        private readonly IUnitOfWork _uow;
        private readonly INewsService _newsService;

        protected BaseController(IUnitOfWork uow, INewsService newsService)
        {
            _uow = uow;
            _newsService = newsService;
        }

//...

}

один из контроллеров:

public partial class HomeController : BaseController
{

    private readonly IUserService _userService;
    private readonly IMemberService _memberService;
    private readonly IUnitOfWork _uow;
    public HomeController(IUnitOfWork uow, IUserService userService, IMemberService memberService, INewsService newsService): base(uow, newsService)
    {
        _userService = userService;
        _memberService = memberService;
        _uow = uow;
    }

//...
}

Но я получаю эту ошибку для каждого контроллера в сгенерированных классах t4mvc, например, эту ошибку:

'MvcApp.Controllers.BaseController' does not contain a constructor that takes 0 arguments.

в HomeController.generated.cs файле.

РЕШЕНИЕ

https://stackoverflow.com/a/15320890/1719207


person user197508    schedule 09.03.2013    source источник


Ответы (4)


Похоже, ваш контейнер IOC (если он существует) не перезаписывает фабрику контроллеров по умолчанию. Если вы используете Ninject, вы должны установить проект Ninject.MVC3. Каждый контейнер должен переопределить фабрику контроллеров по умолчанию, чтобы он мог создавать их и внедрять зависимости.

Для StructureMap вам потребуется StructureMap.MVC3 или StructureMap.MVC4

person Jon    schedule 09.03.2013
comment
Я использую StructureMap и переопределил фабрику контроллеров по умолчанию. Я получаю эту ошибку во время компиляции, а не во время выполнения. - person user197508; 09.03.2013
comment
Бьюсь об заклад, вы получите его и во время выполнения;) - person Jon; 09.03.2013
comment
Вы установили пакеты SM MVC? nuget.org/packages/StructureMap.MVC3 - person Jon; 09.03.2013
comment
когда я создаю решение, я получаю эту ошибку или когда я «запускаю пользовательский инструмент» в t4mvc;) - person user197508; 09.03.2013

Контроллер с такими зависимостями пахнет. Это технический термин, который я недавно выучил ^_^

Во-первых, у меня есть UoW в фильтре действий, и я использую атрибут, чтобы отметить транзакцию действия (в моем случае я совместил его с аудитом). Остальные из них, если они действительно настолько сложны, вероятно, должна быть служба приложений, чтобы обернуть их.

Просто мысль. Я настоящий новичок.

person Whoever    schedule 09.03.2013

Это похоже на Базовый контроллер T4MVC не имеет конструктора по умолчанию.

Можете ли вы изменить свой базовый контроллер на абстрактный? Если это так, я верю, что это заставит вещи работать.

person David Ebbo    schedule 10.03.2013
comment
Привет, Дэвид Эббо, +1 голос, я протестировал ваше решение и сработало для меня, но у CodeRush возникает проблема в подклассе, который «Конструктор базового типа не реализован». .пожалуйста, посмотрите мое решение. - person user197508; 10.03.2013
comment
Дэвид Эббо, также в вашем решении некоторые перегруженные методы имеют дополнительный аргумент «результат ActionResult», недоступный в базовом контроллере! - person user197508; 10.03.2013

Дополнение к решению Дэвида Эббо, это

Еще одно решение:

Я только что добавил в свой базовый контроллер конструктор по умолчанию, например:

protected BaseController(){}

Теперь это работает нормально (без проблемы CodeRush «Конструктор базового типа не реализован» в подклассах).

person user197508    schedule 10.03.2013