2015-12-10 2 views
0

TL; DR версияЧто означает инъекция зависимости?

Можете ли вы объяснить концепцию инъекции зависимостей к «энтузиастам программисту» с фундаментальным пониманием программирования. т.е. Классы, функции и переменные.

Какова цель инъекции зависимостей, это чисто понятность/простота программирования или она также обеспечивает возможность компиляции во времени?

Моя оригинальная версия более waffly!

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

В первую очередь я отбрасываю вещи между функциями и классами и переменными! (как то, что я узнал на моем c64 давным-давно!)

Зависимость впрыска, кажется, повсюду в последнее время, и, хотя я думаю, что я ее получаю, я чувствую, что мне не хватает точки (или чего-то еще)

Проблема заключается в том, что, когда я пытаюсь разобраться в том, что происходит на фундаментальном уровне, она очень быстро становится очень сложной, и у меня болит голова (я - медведь с очень маленьким мозгом и большими словами, смущает меня!)

Так что я надеюсь, что кто-то может объяснить инъекцию зависимости к пятилетнему ребенку! Что это, зачем мне это нужно, как это делает мое кодирование лучше. (идеально работающий в понятиях функций, классов и переменных!)

Это, в основном, независимое от языка, кажется, что все языки используют, но мой язык выбора - это обычно C# (обычно ASP/MVC, хотя некоторые родные Windows/Console), хотя я недавно начал совать с Nodejs.

На самом деле, кажется, это дубликат этого вопроса - What is dependency injection?

(которые жили гораздо лучше, чем моя версия - это то, что я получаю за ячеистой ткани)

+2

Инъекция кода или инъекция _dependency_? В любом случае ваш вопрос может быть вне темы для SO, потому что речь идет не о _ «[конкретной проблеме программирования] (http://stackoverflow.com/help/on-topic)», а скорее определении словаря. – MickyD

+0

Я думаю, что я всегда объединял этих двух вместе в своих мыслях (я знаю, что это не так! Его просто то, что я не понимаю ни того, чтобы они сливались вместе в синергии недоразумения!) –

+0

@ Микки моя мысль заключалась в том, что это подпадает под «практическую и ответственную проблему, которая уникальна для разработки программного обеспечения». Есть ли лучший сайт, на который можно задать такой вопрос? –

ответ

1

Code Injection может иметь различные значения в зависимости от контекст.

Например, в контексте security это может означать, что вредоносный код вводится в ваше приложение (например, sql-injection).

В других контекстах (например, aspect-oriented programming) это может означать способ исправления метода с дополнительным кодом для аспекта.

Dependency Injection - это что-то другое и означает способ для одной части кода (например, класса) иметь доступ к зависимостям (другие части кода, например, другие классы, зависит от них) модульным способом без жесткого кодирования (поэтому они могут меняться или быть перегружены свободно или даже загружаться в другое время по мере необходимости)

2

Зависимость впрыска позволяет разработчику помещать ссылку на класс в проект a без создания его как объекта.

В случае с пружиной, где у меня больше всего знаний о DI, я хотел бы, чтобы путь к классам был создан в файле конфигурации config.xml, и я могу передать эту ссылку класса любому классу, если бы мне это нужно было вызвать. Введенный класс похож на одноэлементный, поскольку только одна ссылка передается без объявления ее как одноэлементного. Обычно это класс обслуживания, который вводится.

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

Вот почему я говорю, что это больше похоже на синглтон, используя только один экземпляр

public class Foo {  
     // Constructor 
     public Foo() { 
      // Specify a specific implementation in the constructor instead of using dependency injection 
      Service service1 = new ServiceExample(); 
     } 

     private void RandomMethod() { 
      Service service2 = new ServiceExample(); 
     } 
    } 

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

public class Foo { 
     // Internal reference to the service 
     private Service service1; 

     // Constructor 
     public Foo(Service service1) { 
      this.service1 = service1; 
     } 
    } 

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

+0

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

Смежные вопросы