在BaseController在MVC3 Ninject不绑定对象 [英] Ninject not binding object in BaseController in MVC3

查看:114
本文介绍了在BaseController在MVC3 Ninject不绑定对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚升级我的MVC2项目MVC3和使用的NuGet库包参考安装ninject。这创造了一个AppStart的阶级和我用下面的code注入我的IMembershipService类。

I just upgraded my MVC2 project to MVC3 and used the NuGet library package reference to install ninject. This created an appstart class and i used the following code to inject my IMembershipService class.

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

这与我的HomeController中的伟大工程,例如。

This works great with my HomeController, for example.

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

    public HomeController() : this(null) { }

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

不过,我使用的是BaseController。几乎在基类相同code不再起作用。

HOWEVER, I am using a BaseController. Nearly the same code in the base class no longer works.

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国际奥委会对这样也许答案是显而易见的,但为什么会喜欢我希望它岂不注入我AccountMembershipController基类?我看不出有什么不同,虽然我意识到继承额外的水平可能与Ninject某种程度上搞乱。

If I break in the constructor of the base controller, service is just NULL. I have never used Ninject for IOC so perhaps the answer is obvious, but why will it not inject my AccountMembershipController in the base class like I want it to? I don't see what is different, although i realize the extra level of inheritance may be messing with Ninject somehow.

推荐答案

我遇到了同样的问题我自己。假设你的code是这样的:

I ran into this same problem myself. Assuming your code looks like this:

public HomeController : BaseController
{

}

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

    public MembershipService() { }

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

由于某些原因, Ninject 认为的HomeController 只有一个构造函数,默认的无参数之一。当你把一切都放在的HomeController ,它可以找到注射构造,但它的因素伸到一个基类,由于某种原因,它不会看在基类看如果有任何重载的构造函数。有两种修复这样的:

For some reason, Ninject thinks that HomeController only has one constructor, the default parameterless one. When you put everything in HomeController, it can find the injectable constructor, but factor it out into a base class and for some reason it won't look in the base class to see if there are any overloaded constructors. There are two fixes for this:


  1. 删除默认的构造函数。这是我的preferred解决方案,因为它迫使构造函数注入(当你手动创建控制器时,单元测试等),但缺点是,你必须实现在所有的子类的构造。

  2. 保持默认的构造函数,但 [注入]属性添加到您的所有注射​​属性:

  1. Remove the default constructor. This is my preferred solution because it forces the constructor to be injected (like when you create the controller manually when unit testing), but the downside is that you have to implement the constructor in all your subclasses.
  2. Keep the default constructor, but add the [Inject] attribute to all your injectable properties:

public BaseController : Controller
{
    [Inject] public IMembershipService MembershipService { get;set; }
    // rest is the same
}


Ninject将正确注入特性这种方式,但要注意,Ninject将调用参数的构造函数。

Ninject will inject the properties correctly this way, but be aware that Ninject will call the parameterless constructor.

这篇关于在BaseController在MVC3 Ninject不绑定对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆