2014-10-17 33 views
0

試圖將需要傳遞給控制器​​方法的依賴項作爲接口註冊,並在做了一些研究之後,它設置在Sitecore的控制器,將引發此errpr找不到用於支持Sitecore.Mvc.Controllers.SitecoreController服務的組件 - Sitecore 7.2

ControllerBuilder.Current.SetControllerFactory(new WindsorControllerFactory(container.Kernel)); 
container.Register(Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient().Configure(x => x.Named(x.Implementation.FullName))); 

代碼段是

public ActionResult Footer(ISomeFactory someFactory) {} 

我使用玻璃Mapeer和溫莎城堡的國際奧委會。

回答

2

您需要告訴Castle如何解析未在您的程序集中定義的SitecoreController。試試這個:

 container.Register(
      Classes.FromThisAssembly() 
       .BasedOn<IController>() 
       .LifestyleTransient() 
       .Configure(x => x.Named(x.Implementation.FullName)), 
      Component.For<SitecoreController>() 
        .ImplementedBy<SitecoreController>() 
        .LifestylePerWebRequest() 
        .DependsOn(new {databaseName = Sitecore.Context.Database}) 
      ); 

編輯:基於評論你可以擴大這個註冊這樣的東西。您可能需要查看每個對象的生活方式設置,並根據Controller的構造函數,您可能需要添加其他實現。

container.Register(
      Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient(), 
      Component.For<ISitecoreContext>().ImplementedBy<SitecoreContext>().LifestylePerWebRequest(), 
      Component.For<ISitecoreService>().ImplementedBy<SitecoreService>(), 
      Component.For<IGlassHtml>().ImplementedBy<GlassHtml>().LifestylePerWebRequest(), 
      Component.For<SitecoreController>() 
       .ImplementedBy<SitecoreController>() 
       .LifestylePerWebRequest() 
       .DependsOn(new {databaseName = Sitecore.Context.Database}) 
      ); 
+0

謝謝馬特。這解決了這個問題。但是現在我得到了[MissingMethodException:無法創建接口的實例。對象類型'Glass.Mapper.Sc.ISitecoreContext'。]。我認爲Windsor Castle和MVC 5存在問題。我甚至刪除了Glass Mapper和Solr的集成,並試圖在應用程序啓動時在GLobal.ascx.cs文件中執行此操作,但仍然出現此錯誤。無論是MVC 5與WindsorCastle不兼容還是有其他一些事情我缺失 – 2014-10-17 15:52:12

+0

Glass,Castle和MVC 5一起工作得很好。這個錯誤提示Castle正試圖通過界面來解析界面。你可以通過註冊ISitecoreContext來解決這個問題。我用更全面的register()方法更新了我的答案。 – 2014-10-17 18:48:44

+0

感謝馬特和你是對的,所有這些一起工作,但一旦你明白髮生了什麼事情。我在GlassMapperScCustom中做了一些改變,使用了GM的DependencyResolver.CreateStandardResolver()中的容器。這導致取消註冊Sitecore控制器。我會寫答案,以便其他人閱讀。 – 2014-10-17 18:53:47

2

好的經驗教訓。首先,當您使用Sitecore MVC時,Glass Mapper和Solr不會混用他們的Windsor容器。我開始使用GM的Windsor容器,並在GlassMapperScCustom.CastleConfig(IWindsorContainer容器)中添加註冊代碼以註冊我的組件。這導致SitecoreController未註冊,並拋出錯誤「沒有組件支持Sitecore.Mvc.Controllers.SitecoreController被發現」。當我執行Matt Gartman建議的解決方案時,它就起作用了。但我不喜歡這個,想要一個更清潔的評論。所以這裏是我的建議。

  1. 創建一個單獨的溫莎容器並註冊您的組件。做到這一點Global.ascx.cs Application_Start()
  2. 保持玻璃映射器和Solr容器不變。不要使用他們的容器。
  3. 您現在可以使用Controller Constructor DI進行設置。
  4. 如果您正在嘗試使用方法DI,那麼這是單獨的事情,並且不要假設它與構造函數DI一起工作。經驗教訓很難。

希望這個討論會幫助那些試圖用這些技術做這一切的人。

相關問題