BaseController не содержит конструктор, принимающий 0 аргументов

Я пытаюсь определить базовый контроллер в ASP.NET проект MVC —

public abstract class BaseController:Controller
{
    protected readonly ExpressDbContext DbContext;
     string _baseUrl;

    public BaseController(ExpressDbContext context)
    {
        _baseUrl = ConfigurationManager.AppSettings["BaseUrl"].ToString();
        DbContext = context;
    }

    protected new ViewResult View()
    {
        this.ViewBag.BaseUrl = _baseUrl;
        return base.View();
    }       
}

Затем наследование его от другого контроллера-

public class HomeController : BaseController
{        
    public ActionResult Index()
    {
        return View();
    }
}

Я видел несколько примеров, чтобы объявить базовый контроллер, как это. Но на этот раз я получаю исключение-

BaseController does not contain a constructor that takes 0 arguments

Я также связываю DbContext в Ninject —

kernel.Bind<ExpressMvc.DB.ExpressDbContext>().ToSelf().InRequestScope();

Что-то я пропустил или не знаю?

3 ответа

  1. Используйте пустой конструктор. В противном случае компилятор c# не находит перегрузки, поэтому он выдает ошибку. Он находит только перегрузки BaseController (контекст ExpressDbContext).

    public BaseController()
        {
    
        }
    

    Если этот параметр отсутствует, компилятору неявно предлагается использовать конструктор по умолчанию без параметров. Поскольку такой конструктор не существует в базовом классе, это дает вам эту ошибку.

  2. Вместо добавления пустого конструктора в абстрактную базу , которая может быть не то, что вы хотите, если вам действительно нужноExpressDbContext, вы должны добавить конструктор в свою реализацию вместо этого.

    public class HomeController : BaseController
    {
        public HomeController(ExpressDbContext context)
            : base(context)
        {
    
        }
    
        public ActionResult Index()
        {
            return View();
        }
    }
    
  3. Поскольку вы наследуете от BaseController, в котором явно определен конструктор с одним аргументом, конструктор без параметров по умолчанию не создается для BaseController, а HomeController не имеет определенного конструктора, поэтому создается конструктор без параметров и ожидается конструктор с той же сигнатурой в базовом классе.

    Можно создать конструктор без параметров в базовом классе или явно определить, что этот конструктор public BaseController(ExpressDbContext context)должен называться так

    public class HomeController : BaseController
    {        
        public HomeController():base(ExpressDbContext _ObjectToBePassedToTheBaseConstructor)
        {
        }
        public ActionResult Index()
        {
            return View();
        }
    }