2011-02-04 16 views
1

我正在關注Steven Sanderson的Pro MVC2書籍,並對使用Ninject有疑問。如何在MVC中使用Ninject查詢參數?

在體育商店的例子,我們在Global.asax.cs中

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 

NinjectControllerFactory被定義爲:

public class NinjectControllerFactory : DefaultControllerFactory 

{ 
    //A Ninject "kernet" is the thing that can supply object instances 
    private IKernel kernel = new StandardKernel(new SportsStoreServices()); 


    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) 
    { 
     return (IController)kernel.Get(controllerType); 
    } 

    private class SportsStoreServices : NinjectModule 
    { 
     public string QString = null; 
     public override void Load() 
     { 

      Bind<IProductsRepository>().To<SqlProductsRepository>() 
       .WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString); 


     } 
    } 

} 

正如你所看到的SqlProductsRepository從取連接字符串配置文件。如果我需要根據URL查詢字符串參數做出決定,例如如果param1 = true我想從一個存儲庫加載另一個,我該怎麼做?我試圖看看如何訪問Load()方法中的查詢參數,但我無法找到一個預填充的地方。

也是Load()基於查詢參數做出決定的正確位置,還是應該以某種方式在Controller中作出此決定?

+0

不是一個nark,但是... Ctrl-K非常適合正確縮進代碼並標記關鍵字 – 2011-02-04 23:42:57

回答

1

一個會有多個具有.WithMetadata(或其特殊情況,是.Named())的綁定。然後,在解析時,您需要將元數據過濾器和/或名稱參數傳入.Get<>()調用以指示綁定。一個小的但在這裏搜索將會產生例子,但到目前爲止,ninject示例的最佳來源是ninject測試,它非常乾淨,也是ninject文檔沒有得到他們應得的愛的一個原因(即v2更新)。

即你把一個名稱或元數據過濾器作爲額外PARAM到:

return (IController)kernel.Get(controllerType, **here**); 

至於如何在更復雜的情況下,管理這種最佳實踐,我個人會去閱讀品牌Wilson的集他們是如何做到的MVC中的職位3.

我想這取決於你的目標和目的:

  1. 拍樣片做一些事情,而你學習 - 睫毛上面
  2. 理清DI基礎架構,讓你快樂,運行和購買Dependency Injection in .NET by Mark Seemann,認真考慮ASP.NET MVC 3和讀取布拉德威爾遜系列文章無論哪種方式
0

一個模塊的負載()方法僅被調用時應用程序啓動並且內核初始化。因此,沒有請求上下文來作出決定。

如果是我,我會將兩個存儲庫注入控制器並讓控制器決定使用哪個存儲庫。這樣你可以編寫單元測試來驗證它是否做出了正確的決定。

相關問題