当我有一个BaseController时,使用Ninject和Entity Framework 5

时间:2012-10-08 14:36:35

标签: asp.net-mvc entity-framework ninject

我当前的堆栈是ASP.NET MVC 4和Entity Framework 5.0。我通过NuGet安装了ninject.mvc3,下面显示的代码工作正常:

public class SessionsController : Controller
{
    // use "kernel.Bind<MyContext>().ToSelf().InRequestScope();" 
    // to inject MyContext
    private MyContext _context;

    public SessionsController(MyContext context)
    {
        _context = context;
    }

    [HttpGet]
    public ActionResult Login()
    {
        System.Diagnostics.Debug.WriteLine(_context.Users.Count());
        return View();
    }
}

}

现在,我想为我的控制器提取一个BaseController:

public class BaseController : Controller
{
    protected MyContext _context;

    public BaseController(MyContext context)
    {
        _context = context;
    }

    // I don't know what should be write here and 
    // base controller must have a parameterless constructor
    public BaseController() 
    {

    }
}

然后我让SessionsController从BaseController继承。当我运行代码时,抛出了一个异常

  

“对象引用未设置为对象的实例。(使用MyContext)”

我是否使用Ninject错误?

- 更新 - ninject的NinjectWebCommon.cs代码

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<TelesingContext>().ToSelf().InRequestScope();
    }        

- 更新 - 已编辑的SessionsController.cs代码

public class SessionsController : BaseController
{
    [HttpGet]
    public ActionResult Login()
    {
        System.Diagnostics.Debug.WriteLine(_context.Users.Count());
        return View();
    }
}

}

2 个答案:

答案 0 :(得分:1)

您的问题不在于Ninject或MVC。你在派生类上缺少一个构造函数。

因为构造函数在任何方面都不是多态的(而只能是链接的),所以你仍然必须在派生类上定义一个构造函数,该构造函数接受MyContext并将其传递给基础构造函数:

public class SessionsController : BaseController
{
    public SessionsController(MyContext context) : base(context) { }

    [HttpGet]
    public ActionResult Login()
    {
        System.Diagnostics.Debug.WriteLine(_context.Users.Count());
        return View();
    }
}

您获得异常的原因是因为如果您在类中没有定义构造函数并且基类具有无参数构造函数,则C#编译器会自动在您的类中插入一个无参数构造函数来调用基类< / strong>即可。由于永远不会设置_context变量,因此NullReferenceException行动的Login为{{1}}。

答案 1 :(得分:0)

做你正在做的事情确实没什么好处。如果要在基类中使用构造函数,C#要求您为派生类创建构造函数。因此,您需要这样做:

public class Derived : Base
{
    public Derived(MyContext context) : base(context) { }
}

正如您所看到的,从基础上下文派生出来的工作几乎一样多,那么重点是什么?除了执行标准流程外。

BaseController只需要一个无参数构造函数,因为你还没有定义如何从派生类调用基础构造函数。

Ninject不能神奇地将参数插入到基类中,只有派生类可以这样做。