这个快把我逼疯了。我已经阅读了 Ninject 文档,我已经阅读了 Ninject MVC 扩展的文档,我已经不知道我已经阅读了多少相关的 SO 问题,而且我不知道我的代码的问题出在哪里。
我正在 ASP.NET MVC 4 中构建一个 webapp,并且我正在使用 Ninject 来绑定存储库接口。文档说,如果您使用 NuGet 添加 Ninject(我这样做了),那么它会为您连接所有内容,因此您不需要让您的应用程序继承自NinjectHttpApplication
(所以我没有),您只需要添加您的绑定在NinjectWebCommon.RegisterServices()
,(我有)。我有一个IRepository<T>
, 和一个Repository<T>
. 用户存储库有一些额外的登录和注册方法,因此有一个单独UserRepository
的实现IRepository<User>
. 因此,我的绑定看起来像这样:
kernel.Bind(typeof(IRepository<>)).To(typeof(BaseRepository<>)).InRequestScope();
kernel.Bind(typeof(IRepository<User>)).To(typeof(UserRepository)).InRequestScope();
文档和一些 SO 问题还提到,如果您通过 NuGet(我做了)添加了 Ninject,那么它会为您整理控制器工厂,您不需要实现自己的 Ninject-y 控制器工厂(所以我没有)。我的控制器继承自 a BaseController
,它有一个构造函数,它接受一组IRepository
兼容的存储库。现在,根据我的阅读,当我尝试使用控制器时,Ninject 应该识别IRepositoriy
参数并提供它们。它没有。即使我将[Inject]
属性放在构造函数上,它仍然会被忽略 - 而是调用无参数构造函数。如果我删除无参数构造函数,我会收到一个编译错误,抱怨没有。
我错过了什么?如何让 Ninject 提供我的存储库?