Каков стандартный способ организации проектов Visual Studio и кода для .NET. Кросс-платформенная разработка

У меня довольно большое решение проектов С# в Visual Studio. Я хочу перенести некоторые из этих проектов на работу в МОНО и запустить на MAC. Конечно, некоторые вещи не работают, и некоторые вещи, которые я не хочу переносить, потому что они не применимы к MAC.

Один из подходов - это решения и конфигурации проекта. Это позволяет мне исключать проекты, которые я не хочу создавать (к сожалению, Visual Studio не делает это легко видимым, но в любом случае...).

Второй подход, который мог бы работать в тандеме с первым, - использовать предком-компиляторы, такие как #if MONO, а затем сделать что-то в этой точке. Это хорошо, но затем создает несколько версий одной и той же сборки. Как отличить два от друг друга после компиляции? Это проблема?

Даже если работают два лучших подхода, иногда я хочу часть большого проекта. Я не хочу проходить через 20 или около того файлов и помещать #if MONO? Я могу захватить файл проекта вручную, но на визуальной студии нет видимости. Никто в команде не может сказать, что происходит, если они не выгружают проект и не открывают XML и не смотрят. Это звучит довольно сумасшедшим. Чтобы усугубить ситуацию, иногда проект ссылается на что-то, и я хочу исключить ссылку для МОНО. Теперь мне нужно отредактировать csproj.

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

Я не могу найти хорошее чистое решение. Какие-нибудь советы? Есть ли стандарт для этого, я могу следовать. Если у VS было больше видимости в редактировании файла csproj, это может сработать.

Ответ 1

Вы также можете настроить структуру папок и разделить решение на общее решение, которое содержит независимые от платформы проекты и решения для платформы, которые содержат проекты, специфичные для платформы.

Итак, например, application.sln, содержащий все ваши общие проекты и ради аргумента, у нас также есть решение для iOS и Android.

  • корневая папка
    • приложение (папка)
    • application.Droid(папка)
    • application.Ios(папка)
    • application.sln
    • application.Droid.sln
    • application.Ios.sln

В рамках решений, ориентированных на платформу, вы можете ссылаться на общие проекты, добавляя, например, папку [[application] "с дополнительными общими подпапками проекта для ваших проектов, ориентированных на платформу. Последовательно добавляя все необходимые общие файлы в качестве ссылок.

Вышеупомянутый ответ - одна из возможностей, которые вы могли бы также:

  • Создайте переносимую библиотеку классов, которую вы разделяете между конкретными проектами для платформы.
  • Используйте MvvmCross (MvvmCross GitHub), поэтому у вас есть основной проект, который вы можете ссылаться в своих проектах на платформе.

Ответ 2

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

Однако нелегко ответить на этот вопрос напрямую, поскольку решение, которое вы ищете, может сильно зависеть от вашей реализации. Вообще говоря, я бы посоветовал вам широко использовать хорошо известный дизайн, например Аннотация Factory, Bridge, Facade и т.д.

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

В этот момент вы можете решить во время выполнения, какой бэкэнд вы хотите использовать, выбрав factory, который будет создавать экземпляры ваших классов. Следующим шагом было бы обеспечить некоторую подключаемую систему для загрузки желаемого factory во время выполнения, благодаря отражению эта часть, вероятно, самая простая. Вы проходите, хотя каждая сборка содержится в специальной папке, анализируйте их типы, чтобы определить, реализуют ли они ваши интерфейсы factory, и если они это делают: загрузите их.

Ответ 3

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

На абстрактном уровне одним из подходов к разработке монитора является использование Team Foundation Server (TFS). Он в основном обеспечивает функциональность git для разработки Visual Studio, поэтому вы можете легко отслеживать csproj. Если у вас есть команда, работающая на Java или Android и т.д. Через Eclipse, вы можете использовать TFS через плагин TFS, чтобы держать всех на одной странице и отслеживать изменения и изменения в проектах и ​​в вашем общем решении.

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

Надеюсь, что это поможет.