1

尝试注册需要作为接口传递给控制器​​方法的依赖项,在做了一些研究之后需要完成以下工作,但在设置它之后 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) {}

我正在为 IOC 使用 Glass Mapeer 和 Castle Windsor。

4

2 回答 2

2

好的教训。首先,当您使用 Sitecore MVC、Glass Mapper 和 Solr 时,不要混合使用它们的 Windsor 容器。我开始使用 GM 的 Windsor Container,并在 GlassMapperScCustom.CastleConfig(IWindsorContainer container) 中添加注册代码来注册我的组件。这导致 SitecoreController 被取消注册并抛出错误“找不到支持服务 Sitecore.Mvc.Controllers.SitecoreController 的组件”。当我实施马特·加特曼建议的解决方案时,它就奏效了。但我不喜欢这样,想要一个更清洁的方法。所以这是我的建议。

  1. 创建一个单独的 Windsor Container 并注册您的组件。执行 Global.ascx.cs Application_Start()
  2. 保持 Glass Mapper 和 Solr 容器完好无损。不要使用他们的容器。
  3. 您现在可以将 Controller Constructor DI 与此一起使用。
  4. 如果您正在尝试执行方法 DI,那么这是单独的事情,不要假设它可以与构造函数 DI 一起使用。教训是艰难的。

希望这个讨论能帮助那些试图用这些技术做这一切的人。

于 2014-10-17T19:05:19.910 回答
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})
            );

编辑:根据评论,您可以将此注册扩展到类似的内容。您可能需要查看每个对象的 Lifestyle 设置,并且根据您的 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})
           );
于 2014-10-17T04:20:57.167 回答