1

我刚刚将我的 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();
    }

如果我中断基本控制器的构造函数,则服务只是 NULL。我从未将 Ninject 用于 IOC,所以答案可能很明显,但为什么它不会像我想要的那样在基类中注入我的 AccountMembershipController?我看不出有什么不同,尽管我意识到额外的继承级别可能会以某种方式与 Ninject 混淆。

4

2 回答 2

5

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

于 2010-11-10T20:42:59.367 回答
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
    }
    

Ninject 将以这种方式正确注入属性,但请注意 Ninject 将调用无参数构造函数。

于 2010-11-10T20:47:59.893 回答