【发布时间】:2014-02-14 06:10:39
【问题描述】:
在 MVC 5 中,我们得到了这个看起来像这样的帐户控制器。
public class AccountController : Controller
{
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
我安装了 Ninject 来处理我的依赖注入。我有两个存储库,我想在我的 AccountController 中使用 现在代码看起来像这样
public class AccountController : Controller
{
private readonly ILicenserepository _licenserepository;
private readonly IUserRepository _userRepository;
public AccountController(ILicenserepository licenserepository, IUserRepository userRepository)
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new DatePickerDbContext())))
{
_licenserepository = licenserepository;
_userRepository = userRepository;
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
}
在 ninject.web.common 这就是我所做的
private static void RegisterServices(IKernel kernel)
{
kernel.Bind(typeof (ILicenserepository)).To(typeof (Licenserepository));
kernel.Bind(typeof (IUserRepository)).To(typeof (UserRepository));
}
但是当我运行应用程序时,我在浏览器上收到错误消息,提示找不到无参数构造函数。如果我创建无参数构造函数,我的存储库不会被实例化。所以无论我从存储库中调用该方法,该值都是空的。 我怎么解决这个问题?或者让 MVC 或 Ninject 知道调用哪个构造函数?
【问题讨论】:
-
我没有具体的解决方案,但是当使用任何类型的依赖注入时,您需要替换创建控制器的代码。通常你必须实现你自己的(简单的)控制器工厂来注入你需要的依赖。默认工厂将需要无参数构造函数您还可以从
DefaultControllerFactory扩展(请参阅 msdn:msdn.microsoft.com/en-us/library/…)并在那里解决您的依赖关系。然后将你的新工厂注册到 MVC5 -
您可以通过
ControllerBuilder.SetControllerFactory(链接:msdn.microsoft.com/en-us/library/…)设置新控制器。希望对你有帮助 -
并且 fwiw:不要在构造函数中创建
UserManager,这会使您的类不支持 UnitTest。将 UserManager 实现为接口并将IUserManager作为唯一依赖项传递给类并通过您的 DI 框架解决它
标签: c# dependency-injection ninject asp.net-mvc-5