Надеюсь, относительный простой вопрос. Я начинаю работу над новым внутренним проектом по созданию управляемости ремонтируемых устройств внутри зданий.
База данных хранится удаленно на веб-сервере и будет доступна через веб-API (вывод JSON) и защищена с помощью OAuth. Внешний интерфейс GUI выполняется в WPF, а бизнес-код в C #.
Исходя из этого, я вижу разные уровни презентации / приложения / хранилища данных. Будет код для управления всеми аутентифицированными вызовами API, классом для представления сущностей (бизнес-объектами), классами для создания сущностей (бизнес-объектами), частями для графического интерфейса WPF, частями моделей представления WPF и так далее.
Лучше всего создать это в одном проекте или разбить их на отдельные проекты?
В глубине души я говорю, что должно быть несколько проектов. Ранее я делал это обоими способами и обнаружил, что тестирование проще с помощью одного проекта, но с несколькими проектами могут возникнуть рекурсивные зависимости. Особенно, когда у классов есть интерфейсы, облегчающие тестирование, я обнаружил, что все может стать неуклюжим.
источник
Ответы:
Это зависит от размера проекта
Вот рекомендации, которые я склонен использовать
Небольшой проект с несколькими страницами или меньше, я почти всегда придерживаюсь одного проекта.
Если уровень доступа к данным небольшого проекта большой или сложный, я мог бы разделить его на собственный слой, но в противном случае он просто находится в своей собственной папке.
Если проект больше, у меня почти всегда будет отдельный проект для DAL, и любое дальнейшее разделение зависит от того, где находятся границы между функциональными возможностями приложения.
Если приложение имеет несколько целей, каждая из которых имеет свои собственные представления, модели представления и т. Д., То я обычно разделяю каждую часть на свою область. Если каждый раздел небольшой, я разделяю их папкой. Если каждый раздел большой, я разделю их по проекту.
Если у меня есть несколько проектов , которые должны ссылаться на один и тот же набор объектов (
ViewModelBase
,RelayCommand
, и т.д.), я создам проект только для общих объектов инфраструктуры.Если у меня есть большое количество общих пользовательских стилей / шаблонов / ресурсов, я создам проект только для них.
Как примечание, я допустил ошибку в своем первом большом проекте WPF и разделил их, поместив Модели в один проект, Представления в другой и ViewModels в третий. Теперь я могу сказать вам, что это не тот путь, так как обслуживание становится кошмаром :)
источник
SearchView
,SearchViewModel
иSearchResultModel
все были бы сгруппированы вместе в папке , и я нашел , что это делает приложение легче поддерживать.Interface
для уровня данных, но фактический уровень доступа к данным для поиска будет в библиотеке DAL. Довольно часто у меня естьInfrastructure
илиCommon
библиотека, которая содержит общие базовые классы, интерфейсы и вспомогательные классы.Я видел лучшие результаты с одним проектом на слой плюс проект тестирования на слой. Я видел несколько приложений, которые не могут быть выполнены в 10 или менее проектах в решении, где решение охватывает все .
Не попадайтесь в ловушку использования проектов, где вам действительно нужно пространство имен. Тонны проектов не добавляют ничего, кроме накладных расходов, не принося никакой выгоды.
источник
ИМХО по отдельности почти всегда лучше. Я почти всегда отделяю свой слой данных, если проект не является тривиальным. Причина в том, что слой данных имеет тенденцию проходить чаще всего. Редко вы подключите графический интерфейс к нескольким слоям данных и ожидаете, что он будет работать хорошо. Гораздо более распространенный сценарий состоит в том, что у вас есть один слой данных, и вы хотите, чтобы он был распределен по нескольким графическим интерфейсам (например, ASP.Net, WPF и приложение Silverlight). Это здорово, когда вы можете просто создать проект уровня данных и вставить эту DLL в качестве ссылки в следующем построенном вами графическом интерфейсе.
источник
Для меня 4 * это магическое число. Один проект для каждого уровня и один проект, который определяет все интерфейсы / DTO, необходимые для связи между ними.
* 7, если вы считаете модульные тесты
источник
Я всегда использовал одно решение, если я работаю над этими различными слоями, или если есть тесная связь с ними. Я хочу нажать F5 и при необходимости перестроить все проекты. Я не думаю, что есть «правильный» способ сделать это.
источник
Его личный вкус, самое главное, чтобы быть последовательным . Лично у меня есть отдельный проект для каждого слоя приложения, поэтому разделение очевидно.
источник
Увеличение количества проектов связано с включением модульного тестирования и упрощением графа зависимостей до такой степени, что все становится не так сложно, чтобы изменения в одной части приложения ломали вещи в, казалось бы, не связанных частях приложения.
Это работает, когда я делаю своего рода инверсию зависимостей, чтобы поместить все «контракты», интерфейсы, абстрактные классы, объекты передачи данных в одну сборку. В другой сборке я положил все, что говорит с базой данных. Модульные тесты получают свою сборку. Если пользовательский интерфейс принципиально непроверяем (например, Win.Forms ASP.NET), то есть существенное преимущество разделения пользовательского интерфейса на тестируемый код и непроверяемый код - каждую сборку. Иногда начинает появляться какой-то код, который не имеет ничего общего с базой данных, пользовательским интерфейсом или чем-то, о чем я упоминал до сих пор - это код, который мне хотелось бы видеть в .NET Framework. Этот код я добавлю в сборку утилит, или, по крайней мере, в любую корневую сборку (вероятно, с интерфейсами).
Если все сборки ссылаются на все сборки или почти так, то они должны быть объединены обратно в одну сборку. Если вам или сотрудникам вашей команды не хватает дисциплины, чтобы не помещать код уровня данных в пользовательский интерфейс, а пользовательский интерфейс в уровень данных, то упростите задачу, объединив все это обратно в один слой.
Некоторые выпуски Visual Studio сталкиваются с проблемами производительности примерно на 15 сборках, иногда это зависит от типа проекта. Однако иногда может помочь стратегическая выгрузка файлов проекта.
источник
Единственная веская причина иметь более одного проекта - это если вам нужно совместно использовать набор классов и файлов в нескольких приложениях.
Если проекты используются только одним приложением, они не должны были быть сделаны в первую очередь. Вместо этого используйте пространства имен. Избавьте себя от циклических ссылок, затрат на dll и путаницы в проектах при поиске файлов.
Прочитайте эту статью, чтобы лучше понять, почему это так: http://lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- решение-файл /
И, как говорится в статье, я бы хотел, чтобы любой, у кого есть веская причина иметь несколько проектов, помимо совместного использования кода в приложении, рассказал мне, что это такое, потому что я сомневаюсь, что они есть.
источник