在集成Ninject时遇到麻烦



这个快把我逼疯了。我读过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提供我的存储库?

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

步骤:

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

    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());
        }
    }
    
  4. 并在~/App_Start/NinjectWebCommon.cs中连接它们:

    private static void RegisterServices(IKernel kernel)
    {
        kernel
            .Bind(typeof(IRepository<User>))
            .To(typeof(UserRepository))
            .InRequestScope();
    }        
    
  5. 运行应用程序,相应的存储库实例被注入到homecontorler中。

最新更新