Asp.net mvc 4 集成Ninject有困难

Asp.net mvc 4 集成Ninject有困难,asp.net-mvc-4,dependency-injection,inversion-of-control,ninject,repository-pattern,Asp.net Mvc 4,Dependency Injection,Inversion Of Control,Ninject,Repository Pattern,这件事快把我逼疯了。我已经阅读了Ninject文档,我已经阅读了Ninject MVC扩展的文档,我已经记不清我已经阅读了多少相关的SO问题,我不知道我的代码哪里出了问题 我正在ASP.NETMVC4中构建一个webapp,并使用Ninject绑定存储库接口。文档说,如果您使用NuGet添加Ninject(我这样做了),那么它会为您连接所有内容,这样您就不需要让您的应用程序继承自NinjectHttpApplication(所以我没有),您只需要在NinjectWebCommon.Registe

这件事快把我逼疯了。我已经阅读了Ninject文档,我已经阅读了Ninject MVC扩展的文档,我已经记不清我已经阅读了多少相关的SO问题,我不知道我的代码哪里出了问题

我正在ASP.NETMVC4中构建一个webapp,并使用Ninject绑定存储库接口。文档说,如果您使用NuGet添加Ninject(我这样做了),那么它会为您连接所有内容,这样您就不需要让您的应用程序继承自
NinjectHttpApplication
(所以我没有),您只需要在
NinjectWebCommon.RegisterServices()
(我有)中添加绑定。我有一个
I存储库
,还有一个
存储库
。用户存储库有一些额外的登录和注册方法,因此有一个单独的
UserRepository
,它实现了
IRepository
。因此,我的绑定如下所示:

kernel.Bind(typeof(IRepository<>)).To(typeof(BaseRepository<>)).InRequestScope();
kernel.Bind(typeof(IRepository<User>)).To(typeof(UserRepository)).InRequestScope();
kernel.Bind(typeof(IRepository)).To(typeof(BaseRepository)).InRequestScope();
Bind(typeof(IRepository)).To(typeof(UserRepository)).InRequestScope();
文档和几个问题还提到,如果您添加了Ninject-Through-NuGet(我添加了),那么它会为您整理控制器工厂,您不需要实现自己的Ninject-y控制器工厂(所以我没有)。我的控制器继承自
BaseController
,它有一个接受一组
IRepository
兼容存储库的构造函数。现在,从我读到的内容来看,当我尝试使用控制器时,Ninject应该识别
iRepository
参数并提供它们。没有。即使我将
[Inject]
属性放在构造函数上,它仍然会被忽略-将调用无参数构造函数。如果我删除无参数构造函数,我会得到一个编译错误,抱怨没有


我错过了什么?如何让Ninject提供我的存储库?

奇怪的是,我无法重现您描述的问题

步骤:

  • 使用Internet模板创建新的ASP.NET MVC 4应用程序
  • 安装
    Ninject.MVC3
    numget
  • 定义一些类:

    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());
        }
    }
    
  • 运行应用程序,存储库的适当实例就会被注入HomeController


  • 呵呵。我只是刚刚开始这个项目,所以我开始想,如果只是重新开始,工作是否会少一些……是的,重新开始。我花了不到一分钟的时间为你模拟了那个样品。。考虑到这个问题并不存在,不确定这是否算是一个“解决方案”,但它在一篇简洁的帖子中解释了我必须从模糊和/或奇怪的文档中拼凑出的过程,因此你得到了接受:P
    private static void RegisterServices(IKernel kernel)
    {
        kernel
            .Bind(typeof(IRepository<User>))
            .To(typeof(UserRepository))
            .InRequestScope();
    }