Ho iniziato a programmare professionalmente per anni in diverse aziende e mi considero un programmatore abbastanza competente. Tuttavia, ovunque io abbia lavorato, ci sono dozzine di ingegneri e programmatori di software diversi con dozzine di stili e schemi di codifica diversi. Ho letto tonnellate di letteratura sull'argomento di applicazioni ben progettate, ma onestamente non penso di averne mai visto o pienamente realizzato uno io stesso. Sono curioso di sapere se ci sono delle vere mani su esempi di diversi principi di progettazione, specialmente le applicazioni che implementano un'architettura di servizio adeguata per dare un'idea di tutto.
Ad esempio, la nostra attuale applicazione è iniziata con molte idee di design contrastanti, ma la maggior parte degli ingegneri originali è stata lasciata andare. Ora, ho praticamente un regno libero con un'intera schiera di sviluppatori molto alle prime armi in cui aiutare a formare ed educare mentre iniziano la loro carriera. Sto cercando di dare un esempio positivo implementando progetti facili da seguire, ma comunque robusti.
Dato che la nostra applicazione si trova oggi, abbiamo in qualche modo un'area legacy e la nuova area. L'area legacy è composta da:
- Un livello di repository (creato con ADO.Net), ma è abbastanza stretto e quasi impossibile da testare o scrivere test per.
- Un livello dominio - si basa sui repository, ma mescola la logica tra molte classi e aree diverse
- Un progetto di modello - riflette vagamente i modelli di database
- Un progetto viewmodel
- Un livello logico Web: uno sviluppatore ha passato (in qualche modo) una logica distratta di tutto il web / business e lo ha inserito nel proprio progetto.
- Il livello web - contiene controller, viste e apis web.
Le nuove cose sono simili, ma con un approccio diverso
- Livello entità - Questo progetto contiene solo le entità e i contesti delle entità entità. Ha anche un metodo factory che restituisce il contesto appropriato e ottiene le informazioni sulla stringa di connessione dai nostri file di configurazione per ogni edmx.
- Repository EF - Ogni repository gestisce un sottoinsieme minore di funzionalità, praticamente solo un tipo di entità viene interagito con questo livello a meno che non siano necessari determinati join.
- Livello dominio - Questo livello crea unità di lavoro per ogni funzionalità successiva. Non ha molte / eventuali funzionalità di crossover ed è molto specializzato.
- Progetto test unità - Il progetto test unità crea repository simulati e controlla tutta la logica implementata nel livello dominio.
- Livello Web - responsabile del cablaggio dell'iniezione delle dipendenze e della pubblicazione di viste, controller e metodi API.
Nel nuovo materiale, ogni singolo repository implementa un'interfaccia (quasi un errore) e tutto funziona tramite l'integrazione delle dipendenze. Lo trovo piuttosto semplice, ma temo di fare troppo o troppo poco.
Ad esempio, diciamo che ho un contesto chiamato MainContext
. Nel mio livello di repository, ho un repository chiamato GenericRepository
. GenericRepository
implementa un'interfaccia chiamata IGenericRepository
che espone metodi come Get, Save, ecc. Questi metodi sono gli stessi per la maggior parte degli archivi, ma possono essere sovrascritti se necessario. Potrebbe sembrare qualcosa di simile:
public class GenericRepository<TEntity> : GenericRepository<TEntity> where TEntity : class
{
internal SchoolContext context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SchoolContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}
public virtual void Insert(TEntity entity)
{
dbSet.Add(entity);
}
public virtual void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
// -- more methods
}
Tutti gli altri repository ereditano dal GenericRepository
, ma tutti implementano anche la propria interfaccia che implementa anche IGenericRepository
.
A questo punto ci sono 2 o 3 interfacce profonde, e sto iniziando a sentire che è un po 'eccessivo.
Sto esagerando con il design? Ci sono esempi validi e completi che illustrino il percorso migliore con un design simile?