2014-10-17 5 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))); 

코드 조각을 던졌습니다 것은 내가 유리 Mapeer와 IOC에 대한 성 윈저를 사용하고

public ActionResult Footer(ISomeFactory someFactory) {} 

입니다.

답변

2

어셈블리에 정의되지 않은 SitecoreController를 해결하는 방법을 Castle에 알려줘야합니다. 이것을 시도하십시오 :

 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}) 
      ); 

편집 : 주석에 따라이 등록 정보를 이와 같이 확장 할 수 있습니다. 각 개체의 라이프 스타일 설정을 검토해야 할 수도 있으며 컨트롤러의 생성자에 따라 추가 구현을 추가해야 할 수도 있습니다.

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

감사합니다. Matt. 이로 인해 문제가 해결되었습니다. 하지만 지금은 점점 [MissingMethodException : 인터페이스의 인스턴스를 만들 수 없습니다. 개체 유형 'Glass.Mapper.Sc.ISitecoreContext'.]. Windsor Castle 및 MVC 5와 관련된 문제가 있다고 생각합니다. Glass Mapper 및 Solr와의 통합을 제거하고 GLobal.ascx.cs 파일에서 응용 프로그램 시작시에도이 오류를 계속 가져 오려고했습니다. MVC 5는 WindsorCastle과 호환되지 않습니다. 그렇지 않으면 실종되었습니다. –

+0

Glass, Castle 및 MVC 5는 함께 잘 작동합니다. 이 오류는 Castle이 인터페이스로 인터페이스를 분석하려고 시도하고 있음을 나타냅니다. ISitecoreContext를 콘크리트에 등록하여이 문제를 해결할 수 있습니다. 보다 정확한 register() 메소드를 사용하여 답변을 업데이트했습니다. –

+0

감사합니다. Matt와 당신의 말이 맞습니다.하지만이 모든 일은 함께 할 수 있습니다. GlassMapperScCustom 내부에서 조금씩 다르고, GM의 DependencyResolver.CreateStandardResolver() 컨테이너를 사용하고있었습니다. 이로 인해 Sitecore 컨트롤러가 등록 취소되었습니다. 다른 사람들이 쉽게 읽을 수 있도록 답을 쓸 것입니다. –

2

Ok 학습 교훈. 우선 Sitecore MVC로 작업 할 때 Glass Mapper와 Solr은 Windsor 컨테이너를 혼합하지 않습니다. GM의 Windsor Container를 사용하기 시작했고 GlassMapperScCustom.CastleConfig (IWindsorContainer 컨테이너)에 등록 코드를 추가하여 구성 요소를 등록했습니다. 이로 인해 SitecoreController가 등록 해제되고 "Sitecore.Mvc.Controllers.SitecoreController 서비스를 지원하는 구성 요소가 없습니다"라는 오류가 발생했습니다. 매트 가트 만 (Matt Gartman)이 제안한 해결책을 구현했을 때 효과가있었습니다. 그러나 나는 이것을 좋아하지 않으며 더 깨끗한 appraoch을 원했다. 그래서 여기 내 제안이 있습니다.

  1. 별도의 윈저 컨테이너를 만들고 구성 요소를 등록하십시오. Global.ascx.cs Application_Start()
  2. Glass Mapper 및 Solr Container는 그대로 유지하십시오. 용기를 사용하지 마십시오.
  3. 이제 컨트롤러 생성자 DI를 사용할 수 있습니다.
  4. 메소드 DI를 수행하려는 경우 이는 별도의 것으로서 생성자 DI와 함께 작동하지 않는다. 수업은 어려운 길을 배웠습니다.

이 토론이 이러한 기술로 모든 것을하려는 사용자에게 도움이되기를 바랍니다.