Я работаю над решением Xamarin.Forms, которое использует библиотеку PCL для обмена кодами между моими проектами Android и iOS. Это было здорово, поскольку большинство пользовательских интерфейсов и логический код можно хранить в одном месте. Конечно, есть некоторые классы платформы, которые я создал и связал с PCL, используя DependencyService
, и это нормально для большинства классов, поскольку код значительно отличается между платформами (макет/внешний вид интерфейса), например.Как уменьшить количество дубликатов кода между моими проектами на платформе?
Однако существует одно подмножество классов, которое использует различные пространства имен, которые недоступны для проектов PCL (в частности, пространства имен System.Data). Чтобы обойти это ограничение, мне пришлось написать DependencyService для каждого из этих классов. Меня беспокоит, что код между Android и iOS точно такой же, минус одна или две строки. Код довольно сложный, и я не хочу забывать обновлять его дважды, когда возникнет такая необходимость.
Есть ли способ уменьшить объем кода, дублированного между этими двумя проектами, учитывая, что я не могу поместить код в PCL из-за необходимых пространств имен, которые недоступны?
Я использую 'приманку и switch' метод (http://log.paulbetts.org/the-bait-and-switch-pcl-trick/) НО использовать одни и те же файлы кода на платформе -специфические сборки, создавая два проекта для конкретной платформы, включая/связывая эти файлы кода в каждом проекте с помощью совместно используемого проекта, а затем использовать директивы компилятора платформы для нескольких строк кода, которые меняются между платформами ... Поэтому, смешивая PCL-стиль код с директивами платформы вы можете пропустить дублированный код PCL * требуется * ... – SushiHangover
(продолжение) ... Если у вас действительно большие определения интерфейса или быстро меняющиеся, чтобы сэкономить время на обновление фиктивных подписи PCL, я использовать шаблоны T4 для определения и генерации интерфейсов и отдельных классов, специфичных для платформы ... – SushiHangover
@SushiHangover хороший трюк. Будет придерживаться этого рукава :) – matthewrdev