Что-то, что меня прослушивало с тех пор, как я прочитал ответ на другой вопрос о стеке (точное ускользает от меня сейчас), где пользователь сказал что-то вроде ". Если вы вызываете Service Locator, вы это делаете неправильно."
Это был человек с высокой репутацией (в сто тысяч, я думаю), поэтому я склонен думать, что этот человек может знать, о чем они говорят. Я использую DI для своих проектов, так как я впервые начал об этом узнавать и насколько хорошо это относится к Unit Testing, а что нет. Мне сейчас что-то довольно комфортно, и я думаю, что знаю, что делаю.
Тем не менее, есть много мест, где я использовал 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 для конструктора для этой конкретной реализации.
Это так во многих моих классах. Другим примером является процесс истечения срока действия кеша, который запускает метод, когда объект кэша истекает на моем веб-сайте. Я запускаю множество запросов к базе данных, а что нет. Там тоже я использую Locator для получения требуемой зависимости.
Еще одна проблема, с которой я недавно столкнулся (о том, что я задал здесь вопрос), заключалась в том, что все мои контроллеры потребовали экземпляр IDataContext, для которого я использовал DI, но для одного метода действий требуется другой экземпляр IDataContext. К счастью, Ninject пришел на помощь с именованной зависимостью. Тем не менее, это было похоже на kludge, а не на реальное решение.
Я думал, что, по крайней мере, я поняла концепцию Разделения проблем достаточно хорошо, но, похоже, что-то принципиально неправильно с тем, как я понимаю Injection Dependency и Pattern Locator Service, и я не знаю, что это такое.
То, как я это понимаю в данный момент, - и это может быть ошибочным - это то, что, по крайней мере, в MVC, ControllerFactory ищет конструктор для контроллера и вызывает сам локатор службы, чтобы получить необходимые зависимости, а затем передает их но я могу понять, что не все классы и не имеют Factory для их создания. Таким образом, мне кажется, что некоторые шаблоны Locator являются приемлемыми... но...
- Когда это неприемлемо?
- Какую модель следует искать, когда я должен переосмыслить, как я использую шаблон Locator службы?
- Является ли моя версия ModelBinder неправильной? Если да, то что мне нужно, чтобы научиться его исправлять?
- В другом вопросе в строках этого одного пользователя Марк Семанн рекомендовал абстрактный Factory - как это соотносится?
Я предполагаю, что это - я не могу думать о каком-либо другом вопросе, чтобы помочь моему пониманию, но любая дополнительная информация очень ценится.
Я понимаю, что DI не может быть ответом на все, и я, возможно, перейду за борт в том, как я его реализую, однако, похоже, он работает так, как я ожидаю, с Unit Testing, а что нет.
Я не ищу код для исправления моей реализации примера. Я ищу, чтобы узнать, ищет объяснение, чтобы исправить мое ошибочное понимание.
Я хочу, чтобы у stackoverflow.com была возможность сохранить проекты вопросов. Я также надеюсь, что тот, кто отвечает на этот вопрос, получает достаточную репутацию для ответа на этот вопрос, поскольку я думаю, что я прошу многого. Спасибо, заранее.