Что-то, что прослушивало меня с тех пор, как я прочитал ответ на другой вопрос о стеке (точное время ускользает от меня сейчас), где пользователь указал что-то вроде «Если вы хотите, Re: Caller Locator, вы делаете это неправильно. «Инъекция зависимостей с помощью Ninject, MVC 3 и с использованием шаблона Locator службы
Это был человек с высокой репутацией (в сотнях тысяч, я думаю), поэтому я склонен думать, что этот человек может знать, о чем они говорят , Я использую DI для своих проектов, так как я впервые начал об этом узнавать и насколько хорошо это относится к Unit Testing, а что нет. Это то, что мне сейчас довольно удобно, и я знаю Я знаю, что делаю.
Тем не менее, есть много мест, где я использовал локатор сервисов для разрешения зависимостей в моем проекте. Как только основной пример приходит из моих реализаций 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 является первый просил, это невозможно использовать Dependency Injection на конструктор для этого особая реализация.
Это так во многих моих классах. Другим примером является процесс истечения срока действия кеша, который запускает метод, когда объект кэша истекает на моем веб-сайте. Я запускаю множество запросов к базе данных, а что нет. Там тоже я использую Locator для получения требуемой зависимости.
Другой вопрос, который я имел в последнее время (что я разместил вопрос здесь о) было то, что все мои контроллеры требуется экземпляр IDataContext, который я использовал для DI - но один метод требуются действия другой экземпляр IDataContext. К счастью, Ninject пришел на помощь с именованной зависимостью. Однако это было похоже на клочье, а не на реальное решение.
Я думал, что, по крайней мере, я понял концепцию Разделения забот достаточно хорошо, но, похоже, что-то принципиально неправильно с тем, как я понимаю инъекцию зависимостей и шаблон локатора обслуживания - и я не знаю, что это такое.
Способ, которым я в настоящее время это понимаю, - и это может быть ошибочным, так это то, что, по крайней мере, в MVC ControllerFactory ищет конструктор для контроллера и вызывает сам локатор службы, чтобы получить необходимые зависимости, а затем передает они в. Однако я могу понять, что не все классы и то, что не имеет фабрики для их создания. Так что мне кажется, что какой-то шаблон сервисного локатора допустим ... но ...
- Когда это неприемлемо?
- Какую модель мне следует искать, когда я должен переосмыслить, как я использую шаблон локатора сервисов?
- Является ли моя версия ModelBinder неправильной? Если да, то что мне нужно научиться исправлять?
- В другом вопросе в строках этого одного пользователя Mark Seemann рекомендовал абстрактную фабрику - как это соотносится?
Я думаю, что это - я не могу думать о каких-либо других вопросах, чтобы помочь моему пониманию, но любая дополнительная информация очень ценится.
Я понимаю, что DI не может быть ответом на все, и я могу зайти за борт в том, как я его реализую, однако, похоже, он работает так, как я ожидаю, с Unit Testing, а что нет.
Я не ищу код для исправления моей реализации примера. Я ищу, чтобы узнать, ищет объяснение, чтобы исправить мое ошибочное понимание.
Я хочу, чтобы у stackoverflow.com была возможность сохранить проекты вопросов. Я также надеюсь, что тот, кто отвечает на этот вопрос, получает достаточную репутацию для ответа на этот вопрос, поскольку я думаю, что я прошу многого. Заранее спасибо.
Я думаю, что вы имеете в виду Марка Симана и это сообщение в блоге: http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –