Компонент для поддержки сервиса 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". Когда я реализовал решение, предложенное Мэттом Гартманом, оно сработало. Но мне это не понравилось, и я хотел получить более чистую оценку. Итак, вот мои предложения.
- Создайте отдельный контейнер Windsor и зарегистрируйте свои компоненты. Сделайте это Global.ascx.cs Application_Start()
- Держите стеклянный картограф и контейнер Solr в целости и сохранности. Не используйте их контейнеры.
- Теперь вы можете использовать Controller Constructor DI с этим.
- Если вы пытаетесь использовать метод DI, то это отдельная вещь, и вы не предполагаете, что он работает с Constructor DI. Урок усвоен трудным путем.
Надеюсь, что это обсуждение поможет кому-то, кто пытается сделать все это с этими технологиями.