Ответ 1
Введение
Я тоже спросил себя. Один горящий вопрос, который у меня всегда есть, похож на ваш;
каково было бы хорошее соглашение об именах?
Как мне назвать вещи? Должны ли они идти в папки или проекты?
После обыска, я подозреваю, что это не имеет большого значения. Важно то, что ваше решение имеет разумную архитектуру и что вы пытаетесь следовать хорошим методам, таким как SOLID.
Мои герои ASP ASP MVC по этой теме Джеффри Палермо, Стив Смит и Джимми Богард.
Архитектура лука
Джеффри Палермо обсуждает комбинацию старых идей, но объединяет их и дает визуально стимулирующее название Луковая архитектура (рекомендуемое чтение), Джеффри демонстрирует хороший подход к проблеме того, где положить вещи. Он объясняет, что в центре (или сверху) вашего приложения у вас есть Core. Этот слой должен помещать интерфейсы, такие как IRepository
и IService
.
Почти все ваши интерфейсы должны идти в ядре, а все остальное (другие проекты) может ссылаться на ядро. Таким образом, все знает скелетную структуру приложения, не зная деталей реализации.
Постарайтесь, чтобы ссылка на слой пользовательского интерфейса была как можно меньше (в пределах разумного). В одном из моих приложений мой уровень UI (MVC) ссылается только на Core. Все, что ему нужно, вводится с помощью Injection of Dependency.
Стив Смит обсуждает архитектуру лука и подобные идеи с демонстрациями в Лучшие решения для MVC: решение проблемы решенияМое решение
В моих MVC-решениях у меня типичная структура:
- MyProject.Core
- MyProject.Domain
- MyProject.DependencyInjection
- MyProject.Infrastructure
- MyProject.Web
- MyProject.Tests
Ядро содержит мои интерфейсы. Обычно он делится на такие папки, как "Службы", "Модели", "Домен", "Хранилища" и т.д.
Уровень Домен ссылается только на ядро и содержит мою реализацию. Он предоставляет множество конкретных классов для абстракции домена в ядре. Он имеет дело с большой логикой бизнеса, обработкой, обработкой команд, классами менеджеров, реализацией конкретных сервисов и т.д. Я считаю это довольно внутренним слоем и поэтому он ссылается как можно меньше.
Уровень DependencyInjection содержит мой выбранный пакет DI/framework и детали реализации. Я считаю его внешним слоем; аналогично UI или Infrastructure, и поэтому хорошо, если он ссылается на многое. Не обязательно, чтобы этот слой был отдельным проектом, и многие люди скажут вам не делать этого. Это нормально; сделайте то, что работает для сложности вашего проекта. Мне нравится, что мой ДИ является его собственностью. Хорошая вещь об этом заключается в том, что я могу заменить рамки DI другой, и все будет хорошо. Никакие слои не ссылаются на проект DI.
Уровень Инфраструктура содержит информацию о регистрации, отправке по электронной почте и доступе к данным. Он будет содержать мой ORM. Это не бизнес-логика, а не UI. Это железная дорога моего решения, чтобы все было сделано. Он находится на внешнем слое, но он ссылается только на Core.
Уровень Веб - это мой проект MVC и ссылается только на Core.
Сложность и окончательные мысли
Я нашел ответы на подобные вопросы здесь, но они имеют тенденцию включать более сложную архитектуру, чем то, что я здесь изложил.
Это хороший момент. Важно помнить о сложности вашей проблемы. Но не следует сдерживать хорошие методы решения. Мое решение и архитектура лука не обязательно очень сложны и на самом деле не раздувают ваше решение. Они просто держат все в отдельности.
В Эволюционная структура проекта, Джимми Богард говорит о чрезмерно сложных вещах. Если то, что я сказал, кажется слишком сложным, следуйте советам Джимми и поместите все это в один проект (ваш слой пользовательского интерфейса). Это нормально - если вам это подходит.
Не забудьте принять мое решение только как идею - что-то рассмотреть; мой подход - попытка следовать советам мудрецов из лучших, но я уверен, что мне это удалось только так; Я могу (и должен) еще улучшать.