Подтвердить что ты не робот

Xamarin Shared Projects vs Портативные библиотеки классов

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

Библиотека PCL или общий проект от Xamarin.

В документации по документации Xamarin здесь говорится, что эмпирическое правило состоит в том, чтобы выбрать общий проект, когда мы не будем делиться библиотекой. Общий проект можно записать с помощью #if, чтобы убедиться, что он работает с несколькими платформами - это также вызывает некоторые проблемы с рефакторингом #ifs неактивны.

Но у меня есть ощущение, что неправильно вводить этот код в общий класс. Если код, который должен быть доступен для мобильных платформ Windows, Android и IOS, использует общий проект вместо PCL - это означает, что мы используем #if внутри общего проекта вместо написания кода конкретной платформы в конкретном проекте платформы.

Это пытается поддерживать элементы non PCL через #ifs и сделать общий код более сложным и сложным в обслуживании. Разве это не должно быть сделано Xamarin для улучшения .NET PCL-кода?

А также это означает, что мы добавляем специфические для платформы функции в общем проекте, а не в конкретный проект платформы, т.е. скрываем сложность для конкретной платформы из самого проекта платформы - что кажется неправильным с точки зрения архитектуры.

Я прав (в этом случае я противоречил документации Xamarin), или я что-то не хватает?

4b9b3361

Ответ 1

Оба имеют свое место. Например, вы можете поместить интерфейс в PCL, а затем реализовать его в совместном коде, если бы реализация имела бы приличное количество общего кода.

Мне тоже не нравятся флагов компилятора, я бы предпочел использовать частичные классы. Таким образом, вы можете избежать большинства или даже всех флагов компилятора. Class1.cs перейдет в общий проект, а остальные будут включены в их конкретные проекты на платформе.

Class1.cs
Class1.ios.cs
Class1.android.cs
Class1.wp8.cs

Ответ 2

У них обоих есть свое место. Если ваш код полностью переносится, я бы рекомендовал использовать PCL. Если вам нужно использовать API-интерфейсы, ориентированные на платформу, то вы можете сделать это с помощью PCL, используя различные методы (как правило, связанные с созданием переносимой абстракции для функциональности), но если это изолированный случай, иногда проще просто использовать #if.

Для общего списка плюсов и минусов см. мой ответ на вопрос о PCL и связанных файлах. Совлокальные проекты похожи на связанные файлы, но не имеют некоторых недостатков в инструментах.

Ответ 3

Мое впечатление, что они указали директивы компилятора в разделе "Преимущества общих библиотек", просто потому, что это была функция, которую PCL не поддерживает.

Вы не должны относиться к этому как к поощрению от Xamarin, так как вы и Хамарин осознаете недостатки.

Итак, "умный".

Ответ 4

Я видел большое приложение Xamarin.iOS и Xamarin.Android, разработанное для крупного розничного продавца одежды в Великобритании с мощным MVVM с использованием общей библиотеки и частичных классов. Только несколько очень специфических сценариев, в которых нам нужно было использовать IFDEF. Из этого опыта я часто поехал по этому маршруту по умолчанию.

Сказав это, неплохо отметить, что наступает стандарт .NET 2.0, который, вероятно, сделает эту дискуссию менее распространенным вопросом, поскольку он приносит ей собственный подход (похожий, но очень сильно отличающийся от PCL)... https://blogs.msdn.microsoft.com/dotnet/2016/09/26/introducing-net-standard/