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