Компонент для поддержки сервиса Sitecore.Mvc.Controllers.SitecoreController не найден - Sitecore 7.2

Попытка зарегистрировать зависимость, которую необходимо передать методам контроллера в качестве интерфейса, и после проведения некоторых исследований необходимо выполнить приведенное ниже, но после его установки Sitecore выдает эту ошибку

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 ответа

Решение

Вы должны указать Каслу, как разрешить 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 для каждого объекта, и в зависимости от конструкторов вашего контроллера вам может потребоваться добавить дополнительные реализации.

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

Хорошо, урок усвоен. Прежде всего, когда вы работаете с Sitecore MVC, Glass Mapper и Solr, не смешивайте их контейнеры Windsor. Я начал использовать Windsor Container от GM и добавил регистрационный код в GlassMapperScCustom.CastleConfig(контейнер IWindsorContainer) для регистрации своих компонентов. Это привело к тому, что SitecoreController стал незарегистрированным, и выдало ошибку "Не найден компонент для поддержки службы Sitecore.Mvc.Controllers.SitecoreController". Когда я реализовал решение, предложенное Мэттом Гартманом, оно сработало. Но мне это не понравилось, и я хотел получить более чистую оценку. Итак, вот мои предложения.

  1. Создайте отдельный контейнер Windsor и зарегистрируйте свои компоненты. Сделайте это Global.ascx.cs Application_Start()
  2. Держите стеклянный картограф и контейнер Solr в целости и сохранности. Не используйте их контейнеры.
  3. Теперь вы можете использовать Controller Constructor DI с этим.
  4. Если вы пытаетесь использовать метод DI, то это отдельная вещь, и вы не предполагаете, что он работает с Constructor DI. Урок усвоен трудным путем.

Надеюсь, что это обсуждение поможет кому-то, кто пытается сделать все это с этими технологиями.

Другие вопросы по тегам