无法集成Ninject

时间:2013-03-17 13:33:08

标签: asp.net-mvc-4 dependency-injection inversion-of-control ninject repository-pattern

这个让我发疯。我已经阅读了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提供我的存储库?

1 个答案:

答案 0 :(得分:2)

很奇怪,我无法重现你所描述的问题。

步骤:

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

    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());
        }
    }
    
  5. 并在~/App_Start/NinjectWebCommon.cs

    中将它们连接起来
    private static void RegisterServices(IKernel kernel)
    {
        kernel
            .Bind(typeof(IRepository<User>))
            .To(typeof(UserRepository))
            .InRequestScope();
    }        
    
  6. 运行应用程序,并将正确的存储库实例注入HomeContorller。