2011-03-29 76 views
0

我正在嘗試創建一個簡單的引導程序。我boostrapper代碼如下所示:使用Ninject和DependencyResolver在ASP.NET MVC 3中創建引導程序

public static void Run() 
{ 
    var tasks = DependencyResolver.Current.GetServices<IBootstrapperTask>(); 

    foreach (var task in tasks) 
    { 
     task.Execute(); 
    } 
} 

的IBootstrapperTask界面看起來像:

public interface IBootstrapperTask 
{ 
    void Execute(); 
} 

我的第一次嘗試是通過引導程序註冊路線:

public class RegisterRoutes : IBootstrapperTask 
{ 
    private readonly RouteCollection routes; 

    public RegisterRoutes(RouteCollection routes) 
    { 
     this.routes = routes; 
    } 

    public RegisterRoutes() : this(RouteTable.Routes) 
    { 
    } 

    public void Execute() 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 
    } 
} 

我的長相的Global.asax如:

protected void Application_Start() 
{ 
    DependencyResolver.SetResolver(new NinjectDependencyResolver()); 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    Bootstrapper.Run(); 
} 

而且我NinjectDependencyResolver樣子:

kernel.Bind<IBootstrapperTask>().To<RegisterRoutes>(); 

然而,當我嘗試運行這段代碼,我得到以下異常:

錯誤激活的VirtualPathProvider 沒有匹配的綁定是可用的,並且類型不可自行綁定。

激活路徑:

3)依賴性的VirtualPathProvider注射入型RouteCollection的構造的參數的VirtualPathProvider

2)依賴性RouteCollection注射入型的RegisterRoutes

1)請求的構造方法的參數的路由對於IBootstrapperTask

任何幫助將不勝感激。

編輯

這是需要我的例子來工作缺少約束力是:

kernel.Bind<RouteCollection>().ToConstant(RouteTable.Routes); 

這種結合,如果你使用Ninject MVC擴展,因爲它已經有了這種結合不會被要求和其他一些開箱即用的答案。

回答

1

請參閱https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application關於如何正確使用Ninject.Extensions.MVC。它將添加必要的綁定。

+0

雷莫,你能解釋爲什麼使用擴展將解決我的問題?是否因爲已經爲我建立了某些綁定(如本例中的VirtualPathProvider)?更重要的是,如果我選擇不使用擴展名,那麼什麼樣的綁定可以解決我上面的問題?感謝您的幫助。 – Thomas 2011-03-31 21:15:10

+1

它增加了nesessary綁定。 對不起,不分析你必須添加什麼來修復你自己的實現。我根本沒有時間去支持所有的自定義實現。支持一種實現已經花了很多時間。我沒有看到與定製的一個點。 – 2011-04-01 14:59:47

0

不確定Ninject究竟是什麼,但遇到了與其他容器相同的問題。

看起來像容器默認帶參數的構造函數,嘗試使用自動佈線,但不知道要注入什麼來代替RouteCollection

我想嘗試之一:

  • 調整容器註冊即可使用您需要的精確構造(例如使用拉姆達,我敢肯定Ninject應允許註冊像kernel.Bind<IBootstrapperTask>().To(() => new RegisterRoutes());
  • (可能是更好的方式)註冊一些東西如RouteCollection。Id est - kernel.Bind<RouteCollection>().To(RouteTable.Routes)更新:由於Remo說Ninject有MVC擴展,在這種情況下,這種註冊已經開箱即用(並且很可能需要大多數其他人)。所以,絕對要這樣。爲了方便使用這些擴展是個好主意。
+0

默認情況下,Ninject.Extensions.MVC已經具有Bind ()。ToConstant(RouteTable.Routes)。添加另一個將導致一個異常 – 2011-03-29 18:17:17

+0

也許,但沒有任何關於該主題的擴展(我不知道它們,我主要是一個StructureMap用戶)。而主題中提到的異常**完全**當IoC容器嘗試解析給定的BootstrapperTask的RouteCollection時的異常。它嘗試創建一個RouteCollection類的實例,但未能找到其構造函數的VirtualPathProvider(這意味着'RouteTable.Routes'未註冊爲默認'RouteCollection')。似乎主題啓動器不使用這樣的擴展名。我會稍微更新一下我的答案,以清楚地表明這一點。 – 2011-03-29 19:30:04

相關問題