#dependency-injection #mono
#внедрение зависимостей #mono
Вопрос:
Я работаю над приложением для iOS, где нам нужны разные двоичные файлы для каждого клиента в зависимости от их потребностей. Клиент может захотеть изменить все цвета, значки и тексты. Мы можем сделать это с помощью процесса белой маркировки. Проблема здесь, однако, заключается в том, что они запрашивают другое поведение, например, удаляют экран входа в систему и делают его необязательным для входа в систему.
Я подумал, что мы можем использовать инъекции зависимостей и использовать разные обработчики для каждого клиента, если это необходимо. Например, у нас могут быть LoginHandler1 и LoginHandler2, оба реализующие ILoginHandler и наследуемые от UIViewController.
Однако использование внедрения зависимостей является дорогостоящим, оно замедляет работу приложения, поскольку разрешение является дорогостоящим по сравнению с обычным созданием экземпляра.
Другой способ — определить все эти поведения в приложении и включить / отключить их в файле plist. например, «является ли вход в систему необязательным? да / нет»
Есть предложения?
Спасибо
Ответ №1:
Вы должны создать весь объектный граф заранее, в корне композиции. Создание объекта и внедрение конструктора не должны занимать много времени, если ваши конструкторы не выполняют никакой реальной работы.
При этом бывают случаи, когда создание всего графа объектов в начале приложения может занять больше времени, чем это допустимо. В этих случаях вы можете использовать отложенную загрузку, чтобы отложить дорогостоящую инициализацию на более поздний срок — при этом все еще создавая объекты в корне композиции.
Марк Симанн описывает этот подход более подробно здесь: уверенно составляйте графики объектов.
Ответ №2:
Я подумал, что мы можем использовать инъекции зависимостей и использовать разные обработчики для каждого клиента, если это необходимо.
Вы правильно подумали. Гибкость — одна из основных причин, по которой люди используют DI.
Однако использование внедрения зависимостей является дорогостоящим, оно замедляет работу приложения, поскольку разрешение является дорогостоящим по сравнению с обычным созданием экземпляра.
На самом деле это совсем не так дорого. Вы пробовали это сами? Если рассматриваемый объект (т. Е. Вводимый объект) не является очень дорогостоящим для создания экземпляра, у вас нет реальной причины держаться подальше от DI и инверсии управления. Кроме того, как отметил @Lilshieste выше, создание графа объектов заранее (см. AppDelegate ), Вероятно, сделает это еще менее проблематичным.
Хороший способ сделать это описан здесь: http://cocoapatterns.com/passing-data-between-view-controllers / и здесь http://cocoapatterns.com/ios-view-controller-transitions-mediator-pattern /
Другой способ — определить все эти поведения в приложении и включить / отключить их в файле plist. например, «является ли вход в систему необязательным? да / нет»
Хотя это решение менее «элегантное», оно довольно полезное, особенно если проект не очень большой с точки зрения количества классов и VCS. Кроме того, его проще всего реализовать, если код приложения уже выложен, а внесение серьезных изменений в дизайн потребует большого рефакторинга.
Всегда принимайте меры в зависимости от поставленной задачи, редко существует единственное решение проблемы проектирования программного обеспечения.