В настоящее время я пытаюсь лучше понять внедрение зависимостей и использую 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>();
Но мой вопрос в том, **Какую проблему я решил или что я упростил, используя инъекцию зависимостей в этом конкретном случае"
Я не вижу никакого практического использования этого сейчас, я понимаю КАК, но не ПОЧЕМУ? Какова польза от этого? Может ли кто-нибудь дополнить этот проект, привести пример, как это более практично и полезно?