我刚刚将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。
答案 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
中时,它可以找到注入构造函数,但是将它考虑到基类中,并且由于某种原因它不会在基类中查看是否有任何重载的构造函数。有两个修复:
保留默认构造函数,但将[Inject
]属性添加到所有可注入属性中:
public BaseController : Controller
{
[Inject] public IMembershipService MembershipService { get;set; }
// rest is the same
}
Ninject将以这种方式正确注入属性,但要注意Ninject将调用无参数构造函数。