Ninject不绑定MVC3中BaseController中的对象

时间:2010-11-10 20:33:11

标签: asp.net-mvc ninject nuget

我刚刚将MVC2项目升级到MVC3并使用NuGet库包引用来安装ninject。这创建了一个appstart类,我使用以下代码注入我的IMembershipService类。

public static void RegisterServices(IKernel kernel) {
        kernel.Bind<IMembershipService>().To<AccountMembershipService>();
    }

例如,这适用于我的HomeController。

public class HomeController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public HomeController() : this(null) { }

    public HomeController(IMembershipService service)
    {
        MembershipService = service;
    }

但是,我正在使用BaseController。基类中几乎相同的代码不再有效。

public class BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }
    public UserService UserService { get; set; }

    public BaseController() : this(null, null) { }

    public BaseController(IMembershipService service, UserService userService)
    {
        MembershipService = service;
        UserService = userService ?? new UserService();
    }

如果我打破了基本控制器的构造函数,那么service就是NULL。我从来没有将Ninject用于IOC所以也许答案是显而易见的,但为什么它不会像我想要的那样在基类中注入我的AccountMembershipController?我没有看到有什么不同,虽然我意识到额外的继承水平可能会以某种方式弄乱Ninject。

2 个答案:

答案 0 :(得分:5)

来自Controller的HomeController设备,而不是BaseController?此外,您有一个BaseController的默认构造函数,它将事物设置为null。为什么你有这个?我首先要摆脱那些默认的构造函数。您不应该需要任何默认构造函数。

答案 1 :(得分:1)

我自己遇到了同样的问题。假设您的代码如下所示:

public HomeController : BaseController
{

}

public BaseController : Controller
{
    public IMembershipService MembershipService { get; set; }

    public MembershipService() { }

    public MembershipService(IMembershipService service)
    {
        MembershipService = service;
    }
}

出于某种原因, Ninject 认为HomeController只有一个构造函数,默认的无参数构造函数。当你把所有东西都放在HomeController中时,它可以找到注入构造函数,但是将它考虑到基类中,并且由于某种原因它不会在基类中查看是否有任何重载的构造函数。有两个修复:

  1. 删除默认构造函数。这是我首选的解决方案,因为它会强制注入构造函数(就像在单元测试时手动创建控制器一样),但缺点是你必须在所有子类中实现构造函数。
  2. 保留默认构造函数,但将[Inject]属性添加到所有可注入属性中:

    public BaseController : Controller
    {
        [Inject] public IMembershipService MembershipService { get;set; }
        // rest is the same
    }
    
  3. Ninject将以这种方式正确注入属性,但要注意Ninject将调用无参数构造函数。