PCL или клонированные проекты (MvvmCross)

Мне нужен проект WP8 и проект Android. До сих пор я видел только PCL под названием Core, который связан со всеми проектами платформы. Проблема в том, что у меня есть ссылки на конкретные платформы, которые мне нужно включить, в зависимости от платформы. Как я могу справиться с этим?

Я также видел это: https://github.com/Redth/WshLst. Этот проект не имеет PCL и использует клонированные проекты.

Куда мне идти?


person Michael    schedule 16.02.2014    source источник


Ответы (2)


Как вы говорите, есть 2 способа поделиться кодом. Подход PCL и использование связывания файлов (клонирование).

При связывании файлов вы обычно используете директивы #if для указания конкретных функций платформы в вашем ядре. Нравиться:

#if MONOANDROID
    var androidGlobal = this.GetService<Cirrious.MvvmCross.Droid.Interfaces.IMvxAndroidGlobals>();
    _geo = new Geolocator(androidGlobal.ApplicationContext);
#else
    _geo = new Geolocator();
#endif

В проектах PCL вы обычно создаете интерфейс, а затем создаете отдельные реализации для конкретной платформы.

Таким образом, у вас может быть ILocationWatcher в вашем основном проекте PCL. Затем вы можете создать WinPhone.LocationWatcher и Droid.LocationWatcher в каждом из проектов платформы.

Обычно вы должны использовать какой-то контейнер Inversion of Control (IoC) для регистрации конкретного типа patform при запуске. Затем ваш основной проект получит экземпляр либо путем внедрения зависимостей, либо путем разрешения через контейнер IoC. Ваш основной PCL будет программироваться строго в соответствии с интерфейсом, и вам не придется беспокоиться о конкретной реализации.

Вот как работают плагины MvvmCross. Почти все плагины поставляются с базовым интерфейсом и реализацией для конкретной платформы.

person Kiliman    schedule 16.02.2014

Какой путь вы должны выбрать, зависит от вашего приложения и ваших потребностей.

Ресурсы, специфичные для платформы, могут быть введены в PCL с использованием методов Service Location и Plugin:

Кроме того, вы можете использовать общий код с частичными классами, #if и т. д.

Преимущества и недостатки двух подходов обсуждаются в этом превосходном ответе - вместо этого -of-using-add-as/13808655#13808655">В чем преимущество переносимых библиотек классов вместо добавления по ссылке?

person Stuart    schedule 16.02.2014