Каков оптимальный способ организовать проект C#?

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

У Вас есть один проект для модульных тестов, один проект для кода библиотеки классов, один проект для Пользовательского интерфейса?

Или Вы просто делите все они на отдельные папки?

Я думал, что, отделяясь они проектами легче, потому что Ваша центральная библиотека кода в одном месте без прямых ссылок к UserInterface (никакие зависимости WinForms) или UnitTests.

Какие-либо мнения?

9
задан informatik01 19 July 2013 в 23:28
поделиться

8 ответов

Я стараюсь делить проекты на то, что можно назвать "единицами развертывания". Другими словами, "Как я могу развернуть эти сборки?"

Поскольку я явно не развертываю модульные тесты, они находятся в отдельном проекте.

Затем я разделяю UI и "бизнес-логику" на отдельные проекты. Если я сохраняю эти линии разделения чистыми, я могу заменить слой пользовательского интерфейса на новую технологию или инфраструктуру (вспомните WPF против ASP.NET) и при этом повторно использовать сборки "бизнес-логики" для обоих проектов. Я просто ввожу новый слой пользовательского интерфейса, который понимает интерфейс бизнес-логики".

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

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

14
ответ дан 4 December 2019 в 07:46
поделиться

Несколько шаблонов, которые я нашел полезными при организации проектов внутри решения:

У меня почти всегда есть "общий" или "утилитарный" проект. Этот проект должен иметь очень мало зависимостей, чтобы его можно было легко повторно использовать везде и всюду в моем решении (или, возможно, в других решениях). Вы удивитесь, как много маленьких классов-помощников попадет в этот проект.

Я всегда стараюсь отделить бизнес-логику в один проект (или, скорее, в набор проектов), а код bootstrap/provider - в другой проект (или набор проектов). Мои классы bootstrap/provider являются контекстно-специфичными (они могут предполагать наличие HttpContext или args командной строки и т.д.), но они не содержат бизнес-логики. Мои бизнес-классы реализуют бизнес-логику, но не предполагают наличие или отсутствие каких-либо элементов, специфичных для контекста. Таким образом, если я изначально создаю систему как консольное приложение, я могу позже написать набор бутстрапов/провайдеров windows-сервисов и очень быстро превратить ее в windows-сервис с минимальным или нулевым влиянием на бизнес-классы.

Подобно классам bootstrap/provider, я также стараюсь изолировать уровень данных от бизнес-классов. Но это обычное, базовое разделение, о котором все слышали 1000 раз, поэтому вряд ли стоит даже упоминать о нем.

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

4
ответ дан 4 December 2019 в 07:46
поделиться

Поищите в Stack Overflow и в Google - есть и другие, которые задавали тот же вопрос.

Некоторые соображения:

Visual Studio требует больше времени для компиляции решений с множеством проектов, чем для отдельных больших проектов. Не делите раствор слишком мелко.

Microsoft Composite Application Guidance предлагает интересный способ разделения проектов. Есть проект инфраструктуры, проект загрузчика, а затем проекты для каждого «модуля» кода.

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

Я предпочитаю организовывать файлы по назначению, а не по типу. Например, я создаю папки с именами «Связь» и «Взаимодействие», а не «События» и «Интерфейсы».

2
ответ дан 4 December 2019 в 07:46
поделиться

Последние несколько проектов, в которых я участвовал - мы закончили со следующей структурой (все проекты WPF Prism):

xxx.Shell.Exe

xxx.yyyModule.dll (x 4-7)

xxx.Tests

xxx. Model

xxx.Common

И для тех, кто использует WCF - добавьте:

xxx.Backend

xxx.DataContracts

Все в одном решении (мы живем с долгим временем сборки...) Разделение на отдельные решения создало слишком много проблем при рефакторинге. До сих пор - это отлично работает для нас.

3
ответ дан 4 December 2019 в 07:46
поделиться

Я разбиваю проекты по типу сборки, как вы описали. Хорошо иметь по крайней мере основной исполняемый проект (если это приложение) и одну или несколько библиотек классов. Если это приложение для windows, определенно постарайтесь отделить пользовательский интерфейс от кода настолько, насколько это возможно. WPF-приложения прекрасно справляются с этой задачей.

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

0
ответ дан 4 December 2019 в 07:46
поделиться

С точки зрения проектов в рамках решения я использую примерно следующее:

Администрирование - Общая документация, главная копия лицензии и т. Д. Я обычно также делаю эту компиляцию в небольшой приложение командной строки "readme", которое отображает лицензию, примечания к редакции и т. д.

Данные - общие данные, такие как XML и т. д. Компилируемый код отсутствует.

Библиотека1 ... LibraryN - одна или несколько библиотек (обычно 1-3: утилиты, ядро, расширенный код).

Приложение1 ... ApplicationN - Приложение (обычно одно).

Test1 ... TestN - Тесты.

В каждом проекте я храню файлы для каждого пространства имен в отдельных папках, подпространства имен в подпапках и т.д. ., в подпапках с одинаковым именем, независимо от проекта.

-Нил

3
ответ дан 4 December 2019 в 07:46
поделиться

Есть ли у вас один проект для модульных тестов, другой проект для библиотеки классов? тестов, один проект для библиотеки классов и один проект для пользовательского интерфейса?

В основном так. Как правило, пользовательский интерфейс остаётся компактным, а вся бизнес-логика переносится в отдельный проект (проекты), при этом на каждый проект бизнес-логики приходится один тестовый проект.

1
ответ дан 4 December 2019 в 07:46
поделиться

Если вы делаете бизнес-приложение с пользовательским интерфейсом, вам стоит обратить внимание на MVC.

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

Есть много ресурсов по MVC в WPF, которые вы, вероятно, можете применить непосредственно и к WinForms.

1
ответ дан 4 December 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: