这个快把我逼疯了。我读过Ninject文档,我读过Ninject MVC扩展的文档,我已经失去了我读过的多少相关SO问题的计数,我不知道我的代码问题在哪里。
我在ASP建立一个web应用程序。NET MVC 4,我使用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控制器工厂(所以我没有)。我的控制器继承自BaseController
,它有一个构造函数,可以接受一组与IRepository
兼容的存储库。现在,从我所读到的,当我尝试使用控制器时,Ninject应该识别IRepositoriy
参数并提供它们。它不是。即使我将[Inject]
属性放在构造函数上,它仍然会被忽略—而是调用无参数构造函数。如果我删除无参数构造函数,就会得到一个编译错误,抱怨没有。
我错过了什么?如何让Ninject提供我的存储库?
奇怪,我无法重现您所描述的问题。
步骤:
- 创建一个新的ASP。. NET MVC 4应用程序使用Internet模板
- 安装
Ninject.MVC3
NuGet -
定义一些类:
public interface IRepository<T> { } public abstract class BaseRepository<T> : IRepository<T> { } public class User { } public class UserRepository : BaseRepository<User> { } public abstract class BaseController<T>: Controller { protected BaseController(IRepository<T> repository) { this.Repository = repository; } protected IRepository<T> Repository { get; private set; } } public class HomeController : BaseController<User> { public HomeController(IRepository<User> repository): base(repository) { } public ActionResult Index() { return Content(this.Repository.GetType().ToString()); } }
-
并在
~/App_Start/NinjectWebCommon.cs
中连接它们:private static void RegisterServices(IKernel kernel) { kernel .Bind(typeof(IRepository<User>)) .To(typeof(UserRepository)) .InRequestScope(); }
-
运行应用程序,相应的存储库实例被注入到homecontorler中。