0

這個讓我很生氣。我已經閱讀了Ninject文檔,我已經閱讀了Ninject MVC擴展的文檔,我已經讀了很多相關的SO問題,並且我不知道問題出在哪裏。在整合Ninject時遇到困難

我正在ASP.NET MVC 4中構建一個web應用程序,並且我正在使用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問題,還提到,如果添加了Ninject不過的NuGet(我做到了),那麼它挑選出你和你不控制器工廠不需要實施你自己的Ninject-y控制器工廠(所以我沒有)。我的控制器繼承自BaseController,它有一個構造函數,它接受一組與IRepository兼容的存儲庫。現在,從我讀過的內容來看,當我嘗試使用控制器時,Ninject應該識別IRepositoriy參數並提供它們。它沒有。即使我將[Inject]屬性放在構造函數上,它仍然會被忽略 - 而不是無參數的構造函數。如果我刪除了無參數的構造函數,我得到一個編譯錯誤,抱怨沒有一個。

我錯過了什麼?我如何讓Ninject提供我的知識庫?

回答

2

奇怪,我無法重現您所描述的問題。

步驟:

  1. 創建一個使用互聯網的模板一個新的ASP.NET MVC應用4
  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. 運行應用程序並將存儲庫的正確實例注入到HomeContorller中。

+0

呵呵。我只是剛開始這個項目,所以我開始懷疑剛開始時是否會減少工作量...... – anaximander 2013-03-17 14:20:48

+0

是的,重新開始。我花了不到一分鐘爲你嘲笑這個樣本。 – 2013-03-17 14:22:06

+0

好吧..不知道這是否是一個「解決方案」,考慮到問題在某種程度上不存在,但它在一個很好的簡潔的文章中解釋了我必須從模糊和/或奇怪的文檔拼湊起來的過程,所以你得到接受:P – anaximander 2013-03-17 15:36:41