Dependency Injection - в чем большие улучшения?

В настоящее время я пытаюсь лучше понять внедрение зависимостей и использую asp.net MVC для работы с ним. Возможно, вы увидите еще несколько моих вопросов по этой теме ;)

Хорошо, я начну с примера контроллера (пример приложения Contacts Manager asp.net MVC)

public class ContactsController{

  ContactsManagerDb _db;

  public ContactsController(){

    _db = ContactsManagerDb();

  } 

  //...Actions here
}

Хорошо, отлично, это работает. Все мои действия могут использовать базу данных для CRUD-действий. Теперь я решил, что хочу добавить модульное тестирование, и я добавил еще один конструкт для имитации базы данных

public class ContactsController{

  IContactsManagerDb _db;

  public ContactsController(){

    _db = ContactsManagerDb();

  }

  public ContactsController(IContactsManagerDb db){
    _db = db;
  }

  //...Actions here
}

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

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

Итак, используя StructureMap, я добавил следующее правило инъекции:

x.For<IContactsManagerDb>().Use<ContactsManagerDb>();

И, конечно же, в своем тестовом проекте я использую другую реализацию IContactsManagerDb.

x.For<IContactsManagerDb>().Use<MyTestingContactsManagerDb>();

Но мой вопрос в том, **Какую проблему я решил или что я упростил, используя инъекцию зависимостей в этом конкретном случае"

Я не вижу никакого практического использования этого сейчас, я понимаю КАК, но не ПОЧЕМУ? Какова польза от этого? Может ли кто-нибудь дополнить этот проект, привести пример, как это более практично и полезно?

10
задан Timo Willemsen 8 October 2011 в 20:53
поделиться