【问题标题】:Inheriting a base controller with constructor使用构造函数继承基本控制器
【发布时间】:2012-08-09 21:35:59
【问题描述】:

我正在使用 ninject 来注入我的存储库。我想继承一个我的基类,但我不能,因为它有一个构造函数。

基础控制器:

namespace Orcha.Web.Controllers
{
    public class BaseController : Controller
    {
        public IRepository<string> db;

        public BaseController(Repository<string> db){
            this.db = db;
            Debug.WriteLine("Repository True");
        }
    }
}

具有继承的控制器: 错误“BaseController”不包含采用 0 个参数 HomeController.cs 的构造函数

public class HomeController : BaseController
{

    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

【问题讨论】:

    标签: asp.net-mvc-3 ninject ninject.web.mvc


    【解决方案1】:

    C# 要求,如果您的基类没有默认构造函数,则必须向派生类添加构造函数。例如。

    public class HomeController : BaseController
    {
        public HomeController(IRepository<string> db) : base(db) { }
    
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
    
            return View();
        }
    
        public ActionResult About()
        {
            return View();
        }
    }
    

    如果您有所需的绑定,则 Ninject 会提供依赖项:

    Bind<IRepository<string>>().To<Repository<string>();
    

    您的 BaseController 不应采用具体的存储库,而是采用接口。

    public class BaseController : Controller
    {
        public IRepository<string> db;
    
        public BaseController(IRepository<string> db){
            this.db = db;
            Debug.WriteLine("Repository True");
        }
    }
    

    【讨论】:

    • 那种似乎是多余的。存储库的重点是不必将 IRepository 放在每个控制器上,它只会继承它。
    猜你喜欢
    • 1970-01-01
    • 2017-11-17
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2015-03-27
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多