#шаблоны_проектирования #net #c_sharp
Вот пример кода из всеми любимого тутора Nerddinner public class DinnersController : Controller { IDinnerRepository dinnerRepository; // // Dependency Injection enabled constructors public DinnersController() : this(new DinnerRepository()) { } public DinnersController(IDinnerRepository repository) { dinnerRepository = repository; } ... Какая разница, если я буду создавать объект репозитория в методах контроллера? public ActionResult Edit(int id) { DinnerReposotiry dinnerRepository = new DinnerRepository(); Dinner dinner = dinnerRepository.GetDinner(id); if (!dinner.IsHostedBy(User.Identity.Name)) return View("InvalidOwner"); return View(dinner); }
Ответы
Ответ 1
Использование DependencyInjection даёт три преимущества. Возможность подменить некий сервис, не являющийся технологически нейтральным. Возможность автоматически тестировать различные модули программы независимо. В Вашем примере Dependency Injection позволяет написать автоматический тест, проверяющий, что DinnersController правильно вызывает методы DinnerRepository. Возможность повторно использовать код DinnersController с другими реализациями IDinnerRepository.Ответ 2
Разница в том, что в классе-потребителе ты будешь работать с объектом на уровне абстракций и иметь возможность подставлять любую реализацию абстрактного интерфейса. Приведу пример: У тебя есть интерфейс, который предоставляет некий набор операций. Сегодня заказчик хочет, чтобы метод GetSomeInfo() реализации этого интерфейса обращался к локальной БД, а так же в будущем еще и к веб-сервисую На начальном этапе ты пишешь реализацию MyBDInterfaceImplementation, у которой GetSomeInfo() обращается к базе. Класс-потребитель при этом просто знает об интерфейсе, что он владеет методом GetSomeInfo и вызывает его. Потом ты реализуешь другой класс, который реализует этот интерфейс и метод GetSomeInfo() в данном случае обращается к веб-сервису. В итоге в классе потребителе тебе не нужно ничего менять, только в месте, где вызывается конструктор этого класса передать ему объект другого типа. Таким образом, на практике пользователь твоего приложения выбирает использовать локальную БД - ты в конструктор класса потребителя передаешь первую реализацию интерфейса, если пользователь выберет веб-сервис - аналогично подставляешь реализацию с доступом через веб-сервис. Следующий плюс - тестируемость. Во-первых, легко писать используя TDD, User Stories и тд. Во-вторых, легко тестировать с помощью моков, подставных реализаций и тд. Так же полезной будет статья Фаулера об IoC. Книги Роба Мартина об агил-девелопменте и чистом коде. Надеюсь, ответ на вопрос помог разобраться.
Комментариев нет:
Отправить комментарий