这个让我发疯。我已经阅读了Ninject文档,我已经阅读了Ninject MVC扩展的文档,我已经忘记了我读过多少相关的SO问题,而且我不知道我的代码问题在哪里。< / p>
我正在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控制器工厂(所以我没有)。我的控制器继承自BaseController
,它有一个构造函数,它接受一组IRepository
兼容的存储库。现在,根据我的阅读,当我尝试使用控制器时,Ninject应该识别IRepositoriy
参数并提供它们。它没有。即使我将[Inject]
属性放在构造函数上,它仍然会被忽略 - 而是调用无参数构造函数。如果我删除无参数构造函数,我会收到编译错误,抱怨没有。
我错过了什么?如何让Ninject提供我的存储库?
答案 0 :(得分:2)
很奇怪,我无法重现你所描述的问题。
步骤:
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();
}
运行应用程序,并将正确的存储库实例注入HomeContorller。