0

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

我正在 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 控制器工厂(所以我没有)。我的控制器继承自 a BaseController,它有一个构造函数,它接受一组IRepository兼容的存储库。现在,根据我的阅读,当我尝试使用控制器时,Ninject 应该识别IRepositoriy参数并提供它们。它没有。即使我将[Inject]属性放在构造函数上,它仍然会被忽略 - 而是调用无参数构造函数。如果我删除无参数构造函数,我会收到一个编译错误,抱怨没有。

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

4

1 回答 1

2

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

脚步:

  1. 使用 Internet 模板创建新的 ASP.NET MVC 4 应用程序
  2. 安装Ninject.MVC3NuGet
  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. 运行应用程序并将存储库的正确实例注入 HomeContorller。

于 2013-03-17T13:54:07.107 回答