В чем разница между перегрузкой и внедрением зависимости? - PullRequest
2 голосов
/ 29 июля 2010

Хотя DI в интерфейсе управляется ... Мне все еще не ясно, что именно отличает это от базовой концепции перегрузки.Любые примеры C # будут полезны.

РЕДАКТИРОВАТЬ: Я прочитал здесь причина моего вопроса , что StreamReader можно рассматривать как пример IoC / DI ... как это полностью отличается отперегрузки?Или это просто подобие DI, а не полностью DI?

Ответы [ 3 ]

14 голосов
/ 29 июля 2010

Это совершенно разные понятия.

Перегрузка: предоставление нескольких методов с одинаковыми именами (или конструкторами), которые отличаются количеством и / или типом параметров.

Внедрение зависимости:предоставление компонентам всех сервисов, с которыми они должны работать (например, аутентификаторы, соединения с базой данных и т. д.), вместо того, чтобы позволить им самим создавать эти зависимости.DI поощряет четкое разделение между интерфейсами и реализацией и значительно упрощает модульное тестирование (так как вы можете имитировать / подделывать зависимости).

РЕДАКТИРОВАТЬ: я не думаю, что я обычно использую StreamReader как хорошийпример внедрения зависимости - в частности, он может создавать свои собственные потоки для вас, если вы укажете только имя файла.Возможно, перегрузки с параметром Stream фактически позволяют вводить зависимость потока, но это не то, что я обычно рассматриваю как DI.Конструктор, безусловно, является примером перегрузки, но эти два действительно не связаны.

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

5 голосов
/ 29 июля 2010

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

Перегрузка - это особенность языка , где (например) два метода могут иметь одно и то же имя, но иметь разные списки параметров. Например:

public Foo MakeFoo(int bar) { }
public Foo MakeFoo(double bar) { }
public Foo MakeFoo(Decimal bar) { }

Внедрение зависимостей - это независимый от языка метод , в котором вы удаляете скрытые зависимости, которые создаются внутри объекта, и вместо этого передаете их в объект. E.g.:

Преобразование этого:

// Foo has an implicit dependency on Bar
class Foo
{
    private Bar myBar;
    public Foo()
    {
        this.myBar = new Bar();  
    }
}

в это:

// Now Foo's dependency on Bar is explicit b/c it's being injected in the .ctor
class Foo
{
    private Bar myBar;
    public Foo(Bar aBar) 
    {
        this.myBar = aBar;
    }
}
2 голосов
/ 29 июля 2010

Трудно ответить на это, так как две концепции действительно не имеют ничего общего.

  • перегрузка: несколько методов (потенциально совершенно разные) имеют одно и то же имя (обычно различающееся в разных списках параметров)

  • Внедрение зависимостей: объекты, которые используются методом (или классом), не создаются внутри метода, но создаются вне и передаются (вводятся) в него.

ОБНОВЛЕНИЕ (на основе ОБНОВЛЕНИЯ ОП):

StreamReader является примером DI, потому что он фактически не создает поток, который он читает - поток создается в другом месте и передается в его ctor. Это позволяет ему работать с потоками любой формы (дисковые файлы, строки, сетевые сокеты и т. Д.)

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