Si usted es el único que trabaja en el proyecto, yo haría lo que tiene sentido para usted primero. No hay nada peor que tener una estructura de directorio o proyecto impuesta sobre ti que no te resulte intuitiva. ¿Está la clase BaseController en la carpeta \ Core \ o en la carpeta \ Controller \? Personalmente miraría en el Controlador pero algunas personas juran que debería estar en \ Core \ o \ Bases.
La primera trampa para principiantes está pensando que puede organizar su código de forma incorrecta y de alguna manera esto se refleja en el éxito del proyecto. He visto proyectos en los que había 30 archivos en una carpeta y otros proyectos en los que había 20 carpetas para 30 archivos.
La segunda trampa para novatos olvida que, en comparación con otros idiomas, tiene la ventaja de contar con intellisense, herramientas de navegación de código y compatibilidad con refactorización de Visual Studio. También tiene un compilador que hace que extraviar un archivo sea menos doloroso. Si coloca algo en el lugar "incorrecto", está bien, siempre puede encontrarlo y arrastrarlo hasta donde debe estar.
Seré honesto Estoy trabajando en un proyecto en este momento y no estoy seguro de dónde residen ciertas clases en mi estructura de archivos. Ir a Definición/Declaración son atajos de teclado que uso mucho. Debido a que solo yo estoy trabajando con el código, esto está bien. Si tuviera que agregar otro desarrollador en el proyecto, probablemente debería limpiar las cosas.
Personalmente tiendo a poner Interfaces con sus tipos de implementación dentro de la misma carpeta. IPaymentGateway está en la misma carpeta que AuthorizeNetGateway y PaypalGateway. Si no puedo ver todos los archivos en esa carpeta a la vez en la barra lateral de mi explorador de soluciones, muevo todos los archivos de Gateway a una carpeta \ Gateway \.
Con Dependency Injection agregado a la mezcla, le aconsejo que solo se preocupe por las explosiones del espacio de nombres. Lo peor que puedes hacer es desordenar tus bootstrappers y archivos con declaraciones y alias largos.
ForRequestedType<Customer>
es más limpio que
using KevDog.Models
using Customer=KevDog.Models.Customer
o
ForRequestedType<KevDog.Models.Customer>
Otra forma de evitar este problema es ser explícita cuando su nombre a las cosas: al cliente, CustomerViewModel, CustomerController, CustomerDataRow, CustomerView
Para TDD casi tiene que tener dos bootstrappers para administrar tus tipos concretos Realmente no desea que sus pruebas unitarias utilicen AuthorizeNetGateway: IPaymentGateway, sino StubGateway: IPaymentGateway.
Ahora también soy nuevo en DI, por lo que tiendo a hacer las cosas muy simples y reflejar los 101 niveles de tutoriales y documentación. Entrar en la inyección dinámica en función de una configuración de compilación solo debe utilizarse cuando una situación específica lo requiera y sepa exactamente por qué lo hace.
Por lo general, también conservo la estructura predeterminada para las aplicaciones MVC. Es simplemente más fácil tener tu código en la misma estructura que el 99% de todos los tutoriales y videos.
Espero que esto ayude.
Mi trampa para principiantes con StructureMap eran las excepciones de permisos de seguridad en Medium Trust. Debería buscar en un contenedor DI alternativo si su aplicación se ejecutará en entornos de confianza media. –