Лично я считаю, что разделение каждого слоя на отдельный проект - лучшая идея.Есть определенные вещи, которых вы не можете достичь, имея 1 большой проект ASP.NET MVC, который включает все ваши слои.
Например, предположим, что у вас есть класс Product и ProductFactory .Вы хотите принудительно создать объект Product через ProductFactory .Для этого вы можете сделать конструктор из Product class внутренний .Таким образом, класс ProductFactory может создавать экземпляр класса Product , поскольку Product и ProductFactory находятся в одной сборке.Однако, если вы попытаетесь создать экземпляр класса Product из другого проекта (т.е. вашего проекта ASP.NET MVC), вы получите ошибку во время компиляции.Таким образом, вы можете добиться лучшей инкапсуляции.
Обратите внимание, что если Product , ProductFactory и ваш Controller находятся в одном проекте, вы все равно можете увидеть Product конструктор в вашем контроллере .Таким образом, разработчик-любитель, который не понимает архитектурных решений, лежащих в основе вашего дизайна, может просто игнорировать ProductFactory и напрямую создавать объект Product .
Кроме того, отдельный проект для каждого слоя упрощает обслуживание, поскольку вам приходится иметь дело с небольшими проектами, а не с одним крупным проектом.