Folder by Type и Folder by Feature
ASP.NET, как и большинство других фреймворков, предлагают использовать свою структуру организации файлов в проекте. Почти всегда используется folder by type подход. Он предполагает разделение файлов по типу. Так все контроллеры лежать в одной папке, вьюхи в другой и т. д.
com.example
├── Domain
│ ├── User.cs
│ └── Pet.cs
├── Controllers
│ ├── UserController.cs
│ └── PetController.cs
├── Repositories
│ ├── UserRepository.cs
│ └── PetRepository.cs
├── Services
│ ├── UserService.cs
│ └── PetService.cs
│ // and everything else in the project
└── Startup.cs
Такой подход неплохо работает на небольших проектах, когда файлов немного и фичи состоят из ограниченного количества классов. Проблемы возникают при росте проекта. Когда разрабатываешь большую фичу нужно постоянно держать в голове что в какой папке лежит, постоянно переключаясь между ними. Частично эту проблему решают IDE, но только частично.
Альтернативой является folder by feature подход, при котором все файлы одной фичи лежат в отдельной папке. В таком случае все необходимое для конкретной фичи лежит под рукой и нет ничего лишнего.
Это позволяет:
- Упростить навигацию в проекте.
- Построить высокоуровневую абстракцию — открываешь проект и сразу понятно что он из себя представляет, из чего состоит.
- Выделить вертикальные слои.
com.example
├── Pet
│ ├── Pet.cs
│ ├── PetController.cs
│ ├── PetRepository.cs
│ └── PetService.cs
├── User
│ ├── User.cs
│ ├── UserController.cs
│ ├── UserRepository.cs
│ └── UserService.cs
│ // and everything else in the project
└── Startup.cs
Обычно проблемы возникают когда появляется общий код, который нужно использовать в нескольких частях приложения. Но, в принципе, это известная проблема и ее можно решить грамотной нарезкой на вертикальные слои. Вторая проблема достаточно банальная — привычки, большинство программистов привыкли к классической компоновки.