Я думаю, что начинать с малого - это хорошо, а затем, когда возникнет необходимость, вы начнете расширять свой обзор и начинаете разделять слои по мере необходимости. Зачем разделять вашу работу на 20 проектов, если у вас есть 2 модели, 1 представление и одна таблица для запроса и обновления в базе данных.
Начните с малого и позвольте «необходимости» управлять проектом. Если вам нужно читать / писать множество таблиц в базе данных, возможно, сейчас самое время начать использовать шаблон репозитория.
Вы обнаружите, что вам нужно как минимум 10 или более различных моделей, возможно, пришло время внедрить библиотеку, содержащую DTO / модели и вывести их из веб-приложения.
Если, например, вам требуется написать модульные тесты или выполнить TDD, вы обнаружите, что возможность мгновенно смоделировать хранилище, бизнес и сервисный уровень пригодится.
Ради аргумента я видел проекты, похожие на приведенные ниже (но большинству не нужен такой уровень разделения):
- веб-проект; использование сервисной библиотеки и библиотеки dto
- Сервисная библиотека; использование библиотеки бизнес-уровня и библиотеки dto
- библиотека бизнес-уровня; использование библиотеки репозитория, библиотеки сущностей и библиотеки dto
- Библиотека репозитория; использование библиотеки объектов
- Библиотека сущностей
- Библиотека dto
Большинство из них были еще более разбиты на отдельные библиотеки, содержащие интерфейсы в одной и реализации в другой и так далее. В некоторых проектах, над которыми я работал, было более 50 библиотек, которые отделяли большинство, если не все, но всегда основывались на требованиях или потребностях.
Идея вышеприведенного примера состоит в том, чтобы веб-приложение просто обрабатывало передачу DTO в сервисный вызов и получение DTO обратно из сервисного вызова.
Вы можете использовать DTO большую часть времени в качестве Моделей, но иногда, если вам нужна плоская модель, основанная на нескольких DTO, вы можете создать свою собственную модель представления в качестве оболочки, чтобы сгладить несколько DTO.
Служба запускается и вызывает метод в менеджере, передавая DTO, который находится в библиотеке бизнес-уровня. Этот менеджер будет использовать DTO и сопоставлять его с одним или несколькими объектами и вызывать методы в хранилище, передавая эти объекты. Хранилище возвращает сущности, которые менеджер использует для создания DTO для отправки обратно.
Есть много способов сделать это, и я уверен, что ни один из них не является единственно правильным.
Вы можете добиться дальнейшего разделения и независимости, используя инфраструктуру внедрения зависимостей, например, Ninject.
Выше приведен лишь один пример. Это может отлично работать для одной группы людей, в то время как другие считают это неприемлемым Это зависит от многих факторов, размер проекта является одним из основных.
Несмотря на все это, всегда начинайте с архитектуры с управляемым размером, которую вы будете постоянно переоценивать по мере необходимости изменений, будь то для удовлетворения насмешек в модульных тестах, количество моделей стало неуправляемым в пределах веб-приложение или теперь отдельная группа должны написать сервисный уровень, и вы не хотите, чтобы это мешало вашей разработке, сервисный уровень теперь может потребляться другим слоем пользовательского интерфейса, а не только вашим веб-интерфейсом и т. д. ...