没有找到支持Sitecore.Mvc.Controllers.SitecoreController服务的组件--Sitecore 7.2

时间:2014-10-17 02:20:17

标签: sitecore sitecore7.2 glass-mapper

尝试注册需要作为接口传递给Controller方法的依赖项,并且在做了一些研究后,需要完成以下操作但是在设置之后Sitecore会抛出这个errpr

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

我正在为国际奥委会使用Glass Mapeer和Castle Windsor。

2 个答案:

答案 0 :(得分: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})
           );

答案 1 :(得分:2)

好的经验教训。首先,当您使用Sitecore MVC,Glass Mapper和Solr时,请不要混合他们的Windsor容器。我开始使用GM的Windsor Container并在GlassMapperScCustom.CastleConfig(IWindsorContainer容器)中添加注册码来注册我的组件。这导致SitecoreController被取消注册并抛出错误&#34;没有用于支持服务的组件Sitecore.Mvc.Controllers.SitecoreController被找到&#34;。当我实施Matt Gartman建议的解决方案时,它就起作用了。但我不喜欢这个,想要一个更清洁的appraoch。所以这是我的建议。

  1. 创建一个单独的Windsor容器并注册您的组件。这样做是Global.ascx.cs Application_Start()
  2. 保持Glass Mapper和Solr容器完好无损。不要使用他们的容器。
  3. 您现在可以使用Controller Constructor DI。
  4. 如果您正在尝试使用Method DI,那么这是独立的事情,并且不要假设它与Constructor DI一起使用。经验教训很难。
  5. 希望这个讨论能帮助那些尝试用这些技术完成所有这些工作的人。