Если вы единственный, кто работает над проектом, я бы сделал , что имеет смысл для вас сначала . Нет ничего хуже, чем навязать вам директорию или структуру проекта, которые вы считаете неинтуитивными. Класс BaseController находится в папке \ Core \ или в папке \ Controller \? Лично я бы посмотрел в контроллере, но некоторые люди клянутся, что он должен быть в \ Core \ или \ Bases.
Первая ловушка для новичка думает, что вы можете неправильно организовать свой код, и это как-то отражается на успехе проекта. Я видел проекты, в которых 30 файлов находились в одной папке, и другие проекты, в которых было 20 папок для 30 файлов.
Вторая ловушка для новичка забывает, что по сравнению с другими языками у вас есть преимущества удивительного интеллектуального анализа, инструментов навигации по коду и поддержки рефакторинга в Visual Studio. У вас также есть компилятор, который делает размещение файла гораздо менее болезненным. Если вы поместите что-то в «неправильное» место, это нормально, вы всегда можете найти его и перетащить туда, где оно должно быть.
Я буду честен, я сейчас работаю над проектом, и я даже не уверен, где находятся определенные классы в моей файловой структуре. Перейти к определению / объявлению - это сочетания клавиш, которые я часто использую. Потому что только я работаю с кодом, это нормально. Если бы мне пришлось добавить в проект другого разработчика, я бы, наверное, все очистил.
Лично я склонен помещать интерфейсы с их типами реализации в одну и ту же папку. IPaymentGateway находится в той же папке, что и AuthorizeNetGateway и PaypalGateway. Если я не могу просмотреть все файлы в этой папке одновременно на боковой панели обозревателя решений, то я перемещаю все файлы шлюза в папку \ Gateway \.
С добавлением Dependency Injection к смеси я бы посоветовал вам заниматься только взрывами пространства имен. Худшее, что вы можете сделать, - это загромождать ваши загрузчики и файлы длинными, используя объявления и псевдонимы.
ForRequestedType<Customer>
чище, чем
using KevDog.Models
using Customer=KevDog.Models.Customer
или
ForRequestedType<KevDog.Models.Customer>
Другим способом избежать этой проблемы является явное указание при именовании: Customer, CustomerViewModel, CustomerController, CustomerDataRow, CustomerView
Для TDD вам почти нужно иметь два загрузчика для управления вашими конкретными типами. Вы действительно не хотите, чтобы ваши модульные тесты использовали AuthorizeNetGateway: IPaymentGateway, а скорее StubGateway: IPaymentGateway.
Теперь я также новичок в DI, поэтому я стараюсь делать все очень просто и отражать учебники и документацию 101 уровня. Введение в динамическое внедрение, основанное на конфигурации сборки, следует использовать только тогда, когда этого требует конкретная ситуация, и вы точно знаете, почему вы это делаете.
Я обычно сохраняю структуру по умолчанию для приложений MVC. Просто проще иметь свой код в той же структуре, что и 99% всех уроков и видео.
Надеюсь, это поможет.