Что-то, что меня беспокоило, так как я прочитал ответ на другой вопрос stackoverflow (точный вопрос теперь ускользает от меня), когда пользователь сказал что-то вроде " Если вы вызываете локатор служб, вы делаете этонеправильно."
Это был человек с высокой репутацией (я думаю, из сотен тысяч), поэтому я склонен думать, что этот человек может знать, о чем он говорит.Я использую DI для своих проектов с тех пор, как впервые начал изучать его и то, насколько хорошо оно относится к модульному тестированию, а что нет.Это то, с чем мне сейчас комфортно, и я думаю Я знаю, что делаю.
Однако во многих местах я использовал Service Locator для разрешения зависимостей в моем проекте.Один из лучших примеров взят из моих реализаций ModelBinder.
Пример типичного связывателя модели.
public class FileModelBinder : IModelBinder {
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext) {
ValueProviderResult value = bindingContext.ValueProvider.GetValue("id");
IDataContext db = Services.Current.GetService<IDataContext>();
return db.Files.SingleOrDefault(i => i.Id == id.AttemptedValue);
}
}
не реальная реализация - просто быстрый пример
Поскольку реализация ModelBinder требует нового экземпляра, когда Binder запрашивается first , невозможно использовать Dependency Injection для конструктора для этой конкретной реализации.
Так во многих случаяхмои занятия.Другой пример - процесс истечения срока действия кэша, который запускает метод всякий раз, когда на моем веб-сайте истекает срок действия объекта кэша.Я запускаю кучу вызовов базы данных, а что нет.Там я также использую сервисный локатор, чтобы получить требуемую зависимость.
Еще одна проблема, с которой я недавно столкнулся (о которой я написал здесь вопрос), заключалась в том, что все мои контроллеры требовали экземпляр IDataContext, который я использовал DIfor - но один метод действия требовал другого экземпляра IDataContext.К счастью, на помощь пришла Ninject с именованной зависимостью.Тем не менее, это было похоже на клочок, а не на реальное решение.
Мне показалось, что я, по крайней мере, достаточно хорошо понял концепцию разделения проблем, но, похоже, что-то в корне неверно в том, как я понимаю внедрение зависимости ишаблон локатора службы - и я не знаю, что это такое.
То, как я сейчас его понимаю, - и это тоже может быть неправильно - это то, что, по крайней мере в MVC, ControllerFactory ищет конструктордля контроллера и вызывает сам сервисный локатор, чтобы получить необходимые зависимости, а затем передает их. Однако я могу понять, что не все классы и что не имеют фабрики для их создания.Поэтому мне кажется, что какой-то шаблон Service Locator является приемлемым ... но ...
- Когда это неприемлемо?
- Каким шаблоном мне следует выглядетькогда мне следует переосмыслить то, как я использую шаблон локатора служб?
- Моя реализация ModelBinder неверна?Если да, что мне нужно научиться, чтобы это исправить?
- В другом вопросе в соответствии с этим одним пользователем Марк Симан рекомендовал Абстрактную Фабрику - Как это связано?
Полагаю, это все - я не могу придумать ни одного другого вопроса, чтобы помочь моему пониманию, но любая дополнительная информация очень ценится.
Я понимаю, что DI не может быть ответом на все вопросыи я, возможно, буду зацикливаться на том, как я его реализую, однако, похоже, что он работает так, как я ожидаю, с модульным тестированием, а что нет.
Я не ищу код, чтобы исправить мою примерную реализацию -Я ищу учиться, ищу объяснение, чтобы исправить мое ошибочное понимание.
Я бы хотел, чтобы stackoverflow.com имел возможность сохранять черновики вопросов.Я также надеюсь, что тот, кто ответит на этот вопрос, получит соответствующую репутацию за ответ на этот вопрос, так как я думаю, что прошу много.Заранее спасибо.