Инъекция зависимости - Разговорное объяснение - PullRequest
3 голосов
/ 08 апреля 2010

Недавно меня попросили выразить ДИ в разговорной речи.

Я ответил:

1) Я еду в отель. Я заказал еду. Руководство отеля просит меня почистить тарелки и очистить таблицы. Итак, я клиент, я отвечаю за управление службой (создание, выполнение, удаление). Но DI разделяет такие задачи, поэтому потребителю службы не нужно беспокоиться об управлении жизненным циклом службы. *

2) Он также спросил, есть ли какой-нибудь API для Microsoft, который следует за DI?

для пункта (1) он сказал, что только 10% верны

для пункта (2) он сказал, что это фабричный шаблон, а не внедрение зависимостей.

На самом деле, что пошло не так в моем объяснении (кроме моего плохого английского)? Каковы реальные ответы на эти вопросы?

Жду ваших ценных предложений.

Ответы [ 3 ]

3 голосов
/ 08 апреля 2010

1.

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

Мой пример - операция / операция.Хирург отвечает за выполнение операции.Вот и все.Она не делает хирургические инструменты и не собирает их все из шкафов.Когда она появляется, чтобы выполнить операцию, все инструменты выстроены в линию и готовы к ней - они были предоставлены извне, и хирург не заботится и не должен знать, кто их туда поместил, пока они доступны.и готово, когда ей нужно работать.

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

2.

Я бы упомянул, что Microsoft Patterns & Practices / Enterprise Library поддерживает DI с прикладным блоком Unity (инверсияконтроля), и я думаю , что библиотека ASP.NET MVC использует DI.

2 голосов
/ 08 апреля 2010

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

На мой взгляд, наиболее важным паттерном DI является Конструкторское внедрение , но на самом деле найти примеры в BCL довольно сложно.

Однако System.IO.StreamWriter является одним из примеров. Среди многих конструкторов есть такой:

public StreamWriter(Stream stream);

Поскольку Stream является абстрактным классом, он идеально подходит под описание зависимости, и он вводится в StreamWriter.

Ваш пример WCF - Абстрактная Фабрика. Это очень важный шаблон, связанный с DI, но не DI сам по себе.

0 голосов
/ 08 апреля 2010

Я думаю, что «разговорный», вероятно, означает описание с использованием нетехнического языка, а не пример из реальной жизни. Итак:

  1. Внедрение зависимостей позволяет пользователю самостоятельно предлагать решение проблемы и интегрировать его в предварительно созданную систему. Я не могу думать о реальной аналогии с этим в данный момент.

  2. Подумайте о методе каркаса, который принимает интерфейс в качестве параметра, и у вас, вероятно, есть пример внедрения зависимости. Я думаю, что есть много примеров в пространствах имен Linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...