尝试注册需要作为接口传递给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。
答案 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。所以这是我的建议。
希望这个讨论能帮助那些尝试用这些技术完成所有这些工作的人。