2010-12-06 107 views
3

我正在研究MVC3 Web應用程序,並發現Ninject出現了一個新問題。MVC3控制器構造函數+ Ninject

我用下面的代碼在我的控制器:

public class TestController : Controller 
{  
    public IRepository<CustomerModel> rep; 

    public TestController(IRepository<CustomerModel> repository) 
    { 
     this.rep = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

而且我Ninject模塊:

public class RepositoryModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind(typeof(IRepository<>)).To(typeof(Repository<>)); 
    } 
} 

然而,這只是拋出我「system.missingMethodException而:此定義無參數的構造函數目的。」當我嘗試呈現索引視圖。

如果我再補充一下:

public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { } 

所以我實際上的TestController樣子:

public class TestController : Controller 
{  
    public IRepository<CustomerModel> rep; 

    public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { } 

    public TestController(IRepository<CustomerModel> repository) 
    { 
     this.rep = repository; 
    } 

    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

它的工作原理,但你可以看到新的構造幾乎打破IOC的整點。

我該如何解決這個問題?

在此先感謝。

+0

什麼控制器工廠實現您使用的是非常糟糕? – 2010-12-06 17:34:35

+0

我只是使用常規的MVC控制器工廠實現。我讀過,你可以讓一個自定義控制器工廠來解決這個問題,但是我只能找到人們使用Structuremap的例子...... – ebb 2010-12-06 17:40:21

回答

2

事實證明,它不是控制器這就是搞亂了起來,但Ninject不正確綁定我的通用信息庫和IRepository - 我因此創建了一個新帖子:Ninject + Bind generic repository

2

您將需要更換控制器工廠,因爲常規的MVC控制器工廠不會執行DI。

你可以看看這裏的如何設置MVC + Ninject的更多信息:MVC3 + Ninject - How to?

4

一個簡短的測試表明,MVC3擴展中的泛型綁定沒有問題。我猜這個問題不在Controller中,但是由於存在一些未知的依賴關係,因此無法創建存儲庫。

但是,這使我改變了依賴解析器一點點,以顯示Ninject堆棧跟蹤,只要所請求的類型可以解析,但其依賴關係之一無法解析。更新到構建服務器上的最新版本以獲得更好的堆棧跟蹤。

0

不要使用此綁定!

綁定(typeof運算(IRepository <>))向(typeof運算(庫<>))。

我改變了我的代碼使用這種結合和服務器被撞毀,它爲一個用戶,但對於成千上萬的請求是

使用

Bind(typeof(IRepository<IClass>)).To(typeof(Repository<Class>))