Я пытаюсь настроить новый сайт Sitecore 7.2, и я хочу интегрировать MVC 5, Glass Mapper и Microsoft Unity в качестве контейнера DI, а Sitecore не хочет играть очень красиво.Sitecore DI с Unity
Мой сценарий заключается в следующем:
- Есть веб-проект под названием PoC.Quotes.Web - это будет содержать только CSS, HTML и любые другие активы, не контроллеры
- есть библиотека классов проект под названием PoC .Quotes.Controllers - это только содержит контроллеры
- есть библиотека классов проект под названием PoC.Quotes.DataLayer - это содержать интерфейс ISitecoreRepository и это конкретная реализация SitecoreRepository
В классе SitecoreRepository есть конструктор, который получает один единственный параметр, Контекст Glass Mapper, а один из моих контроллеров получает один единственный параметр в конструкторе ... ISitecoreRepository.
Sitecore хранилище класса:
public class SitecoreRepository : ISitecoreRepository
{
ISitecoreContext sitecoreContext = null;
public SitecoreRepository(ISitecoreContext context)
{
this.sitecoreContext = context;
}
}
контроллер класса:
public class HomeController : Controller
{
private ISitecoreRepository _repository;
public HomeController(ISitecoreRepository repository)
{
this._repository = repository;
}
}
Каждый раз, когда я запускаю проект Sitecore выдает ошибку о том, что он не может создать контроллер типа (PoC.Quotes.Controllers .HomeController, PoC.Quotes.Controllers). Я предполагаю, что это показывает полное имя, потому что именно так я настроил его в рендеринге контроллера.
Первой проблемой является параметр конструктора контроллера. Я взял его и использовать это заявление, чтобы получить экземпляр для хранилища:
System.Web.Mvc.DependencyResolver.Current.GetService<ISitecoreRepository>();
Результат нулевой, потому что класс SitecoreRepository только имеющий 1 конструктор с 1 параметром и он не будет экземпляр. Как только я получу этот параметр, не задумываясь, все работает отлично.
Однако для меня этот вид не соответствует цели использования контейнера DI.
Я пробовал смотреть на замок Виндзор, но, хотя в Интернете больше документации, ничего не работает, так как у меня возникают похожие проблемы.
Это немного раздражает, потому что, если я запускаю аналогичный тест в базовом приложении MVC 5 (я сделал это, чтобы быть уверенным, что я не сойду с ума), все работает нормально менее чем за 5 минут.
Любые идеи?
Edit:
В интересный поворот, после того, как несколько хороших часов, проведенных по этому вопросу, я заметил, что на самом деле контейнеры либо Unity или Windsor прекрасно работают с одним ограничением ... большой.
В моей визуализации контроллера я установить свойство контроллера как полное имя контроллера:
PoC.Quotes.Controllers.HomeController, PoC.Quotes.Controllers
Однако, если я пойду в Sitecore и изменить это свойство только Home, по мановению волшебной палочки все хорошо. Я даже пробовал промежуточную версию использования PoC.Quotes.Controllers.Home, но все равно получить сообщение об ошибке.
Не уверен, что я делаю что-то неправильно, но это немного странно.
Любые идеи, как исправить это?
Привет, Джим, спасибо за ваш ответ. Моя конфигурация единства довольно проста, добавив конфигурацию интерфейса ISitecoreRepository и интерфейс ISitecoreContext (Glass Mapper). Я пробовал ранее Castle Windsor с фабрикой, как показано в вашем примере, но попал в ту же проблему. –
Можете ли вы установить контрольную точку в своем коде загрузки, чтобы проверить, что у вас есть Global.asax или WebActivator, работающий в Sitecore? –
После нескольких хороших часов декомпиляции Sitecore.MVC я пришел к выводу, что проблема заключается в имени, которое я указываю для контроллера в Sitecore. Если я просто использую «Главная» как имя, все идеально. Как только я использую полное имя, Sitecore использует Reflection для создания нового объекта и поиска конструктора без параметров. Я все еще рассматриваю его, поскольку это, по-видимому, является ограничением использования полностью квалифицированного имени, связанного с ASP.NET MVC. Любая помощь или идеи оцениваются –