Se sei l'unico che lavora al progetto, farei il che cosa ha senso per te prima. Non c'è niente di peggio che avere una directory o una struttura di progetto imposta su di te che non si intuisce. La classe BaseController è nella cartella \ Core \ o nella cartella \ Controller \? Personalmente guarderei nel controller ma alcune persone giurano che dovrebbe essere in \ Core \ o \ Bases.
La prima trappola per principianti sta pensando che è possibile organizzare il codice in modo errato e in qualche modo ciò riflette sul successo del progetto. Ho visto progetti in cui 30 file erano in una cartella e altri progetti in cui c'erano 20 cartelle per 30 file.
La seconda trappola per principianti sta dimenticando che rispetto ad altre lingue si ha il vantaggio di fantastici strumenti di navigazione del codice e di refactoring da Visual Studio. Hai anche un compilatore che rende un file errato molto meno doloroso. Se metti qualcosa nel punto "sbagliato", ok, puoi sempre trovarlo e trascinarlo dove deve essere.
Sarò onesto sto lavorando a un progetto in questo momento e non sono nemmeno sicuro di dove risiedono determinate classi nella mia struttura di file. Vai alla definizione/dichiarazione sono scorciatoie da tastiera che uso molto. Perché è solo io che lavoro con il codice questo va bene. Se dovessi aggiungere un altro sviluppatore al progetto, probabilmente pulirò le cose.
Personalmente tendo a mettere le interfacce con i loro tipi di implementazione all'interno della stessa cartella. IPaymentGateway si trova nella stessa cartella di AuthorizeNetGateway e PaypalGateway. Se non riesco a visualizzare tutti i file in quella cartella contemporaneamente nella mia sidebar di Solution Explorer, sposto tutti i file del Gateway in una cartella \ Gateway \.
Con Iniezione di dipendenze aggiunte al mix, ti consiglio di occuparti solo delle esplosioni nello spazio dei nomi. La cosa peggiore che puoi fare è ingombrare i tuoi bootstrapper e i tuoi file con dichiarazioni e alias lunghi.
ForRequestedType<Customer>
è più pulita
using KevDog.Models
using Customer=KevDog.Models.Customer
o
ForRequestedType<KevDog.Models.Customer>
Un altro modo per evitare questo problema è quello di essere esplicito, quando le tue cose di denominazione: Cliente, CustomerViewModel, CustomerController, CustomerDataRow, CustomerView
Per TDD devi quasi avere due bootstrap da gestire i tuoi tipi concreti. Davvero non vuoi che i tuoi test unitari utilizzino AuthorizeNetGateway: IPaymentGateway, piuttosto StubGateway: IPaymentGateway.
Ora sono nuovo anche in DI, quindi tendo a rendere le cose molto semplici e rispecchiano le esercitazioni e la documentazione di livello 101. Entrare in un'iniezione dinamica basata su una configurazione di build dovrebbe essere usato solo quando una situazione specifica lo richiede e sai esattamente perché lo fai.
Di solito mantengo la struttura di default anche per le app MVC. È più semplice avere il codice nella stessa struttura del 99% di tutti i tutorial e video.
Spero che questo aiuti.
La mia trappola per principianti con StructureMap era eccezioni delle autorizzazioni di sicurezza in Medium Trust. Dovrai esaminare un contenitore DI alternativo se l'app verrà eseguita in ambienti di media affidabilità. –