Я использую Внедрение зависимости: какие типы я должен связать как одиночные элементы?

Существует много вопросов там о том, "плохи" ли одиночные элементы, и что шаблоны использовать вместо этого. Они обычно фокусируются на одноэлементном шаблоне разработки, который включает получение одноэлементного экземпляра от статического метода для класса. Это не один из тех вопросов.

С тех пор, как я действительно "обнаружил" внедрение зависимости несколько месяцев назад, я управлял его принятием в нашей команде, удаляя статические и шаблоны "одиночка" из нашего кода со временем, и с помощью основанной на конструкторе инжекции по мере возможности. Мы приняли конвенции так, чтобы мы не продолжали добавлять явную привязку к нашим модулям DI. Мы даже используем платформу DI для обеспечения экземпляров регистратора, так, чтобы мы могли автоматически сказать каждый регистратор, в каком классе это находится без дополнительного кода. Теперь, когда у меня есть единственное место, где я могу управлять, как различные типы связываются, действительно легко определить, каков жизненный цикл конкретной категории классов (служебные классы, репозитории, и т.д.) должен быть.

Мои начальные взгляды состояли в том, что, вероятно, было бы некоторое преимущество для обязательных классов как одиночные элементы, если бы я ожидал, что они будут использоваться справедливо часто. Это просто означает, что существует намного меньше newпродолжение луга, особенно когда объект Вы создаете, заканчивает тем, что имело большое дерево зависимостей. В значительной степени единственные нестатические поля на любом из этих классов являются теми значениями, вводимыми в конструктора, таким образом, существует относительно мало памяти наверху к имению в наличии экземпляра, когда это не используется.

Затем я считал "Singleton, я люблю Вас, но Вы побеждаете меня" на www.codingwithoutcomments.com, и она заставила меня задаться вопросом, имел ли я верное представление. В конце концов, Ninject компилирует функции создания объекта по умолчанию, таким образом, существует очень мало отражения, наверху вовлеченного в создание дополнительных экземпляров этих объектов. Поскольку мы не допускаем бизнес-логику в конструктора, создание новых экземпляров является действительно легкой операцией. И объекты не имеют набора нестатических полей, таким образом, нет большой памяти, наверху вовлеченной в создание новых экземпляров, также.

Таким образом в этой точке, я начинаю думать, что она, вероятно, не будет иметь значения очень так или иначе. Есть ли дополнительные соображения, которые я не принял во внимание? Кто-либо на самом деле испытал существенное улучшение в производительности путем изменения жизненных циклов определенных типов объектов? Следует DI копируют единственную реальную важную вещь или там другие причины, что использование единственного экземпляра объекта может быть по сути "плохим?"

9
задан StriplingWarrior 13 August 2010 в 20:07
поделиться

4 ответа

Я использую одноэлементные экземпляры для кэширования дорогостоящих объектов (например, фабрики сеансов nhibernate) или объектов, которые я хочу использовать в приложении.

Если вы сомневаетесь, я бы предпочел, чтобы объект воссоздавался каждый раз, когда он используется, и отмечал его как одноэлементный или «на поток» / «на запрос» / «на что угодно», только если вам это действительно нужно.

Распространение синглтонов повсюду, чтобы потенциально сэкономить некоторые новинки, является преждевременной оптимизацией и может привести к действительно неприятным ошибкам, потому что вы не можете быть уверены, новый ли объект или общий для нескольких объектов / экземпляров.

Даже если объект не имеет состояния в данный момент и кажется сохраненным для совместного использования, кто-то может позже провести рефакторинг и добавить к нему состояние, которое затем может быть непреднамеренно разделено между различными объектами / экземплярами.

5
ответ дан 4 December 2019 в 23:38
поделиться

Я не уверен, является ли управление памятью большой проблемой, если только вы не создаете МНОГО объектов. Я обнаружил, что использование синглтона из моего контейнера IoC полезно при работе с чем-то вроде кеширования, когда создание объекта кеширования и подключение к серверам кеширования обходятся дорого во время создания, поэтому мы создаем объект кеширования один раз и повторно используем его.

Одиночный экземпляр может быть вредным, поскольку он может создать узкое место в производительности, поскольку у вас есть единственный экземпляр, обслуживающий несколько запросов в случае служб.

1
ответ дан 4 December 2019 в 23:38
поделиться

Как отмечалось в ответе Гэри , весь смысл DI заключается в тестируемости (вы можете легко имитировать все ссылки на класс, поскольку все они перечислены в конструкторе), не производительность во время выполнения.

Вы хотите, чтобы выполнил TDD (тест-драйв), верно?

0
ответ дан 4 December 2019 в 23:38
поделиться

Это не должно иметь большого значения для использования памяти, но вы получите повышенную модульность, более легкую тестируемость с помощью имитирующих объектов, а эстетическое уродство необходимости выписывать явные зависимости побудит программистов делать каждый класс более ортогонален и независим. Когда ваш класс вызывает глобальные переменные, которые, по сути, являются синглтонами, проще скрыть зависимости, а в дальнейшем это может усложнить вашу жизнь.

0
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: