Mentre finisco un progetto e ne avvio un altro, ho una finestra temporale ridotta per creare un'architettura per il nuovo. Vengo dal seguente design:
-
Applicazione web
Riceve modelli di dominio e amp; DTO, invia DTO
configurazione dell'applicazione, DTO specifiche dell'applicazione + mappatura, servizi specifici per applicazione, & controllori) -
Libreria principale
Riceve modelli di entità, invia modelli di dominio e amp; DTO
modelli di dominio + mapping & repository, mapping di entità, DTO + mapping & servizi, implementazioni di interfaccia specifiche del fornitore come ASP.NET Identity, qualsiasi altra cosa vogliamo -
Raccolta dati
Riceve input da adattatore di database (ODAC in questo caso), Invia modelli di entità
modelli di entità, involucro di contesto di dati aziendali specializzati, rappresentazioni di codice utili di schema, estensioni per l'analisi della risposta dal database -
Libreria infrastruttura
Non riceve nulla, non invia niente
Interfacce, adattatori, wrapper, estensioni e altre cose comuni utilizzati in tutti i progetti
Questi strati non erano inizialmente separati, ma lo sono diventati quando le cose si sono sporcate. Ogni segregazione ha richiesto tempi significativi di refactoring. Anche se tutti erano stati segregati, c'erano ancora alcuni problemi di progettazione:
- Accoppiamento stretto con implementazioni del fornitore come Castle Windsor, AutoMapper e NLog
- Imbarazzo e difficoltà delle implementazioni del repository generico
- Duplicazione della logica (contenitore, azione, ecc.) nelle applicazioni
- Difficoltà nel determinare l'ordine in cui i processi fluiscono e amp; i servizi dovrebbero essere chiamati
Per come la vedo io, la struttura finale del progetto era più che adeguata per supportare un'architettura ben progettata. Il prodotto finale, tuttavia, non è stato progettato come pianificato. Quindi mi piacerebbe iniziare con un'architettura più definita questa volta.
Il grande cambiamento sarebbe quello di astrarre ogni sostanziale implementazione in modo che le chiamate dirette a cose come AutoMapper o NLog non siano necessarie. Ciò richiederebbe un impegno per l'iniezione della deploy e l'implementazione di alcuni sistemi DI e / o contenitori IoC. L'astrazione richiede l'evitamento delle dipendenze inter-layer dirette, il che si traduce in una struttura di progetto più granulare.
La granularità è utile a qualcuno al mio modesto livello di abilità. Mi costringe a considerare dove ogni nuovo componente appartiene. Il problema è che forse non conosco il set ottimale di bucket (tassonomia dei progetti e dei loro componenti) da standardizzare.
La libreria Abp
sembra un modo promettente per iniziare. Fornisce tanta astrazione che una dipendenza diretta su Abp
sarebbe almeno 1-a-1 con qualsiasi struttura che potrei progettare. Fornirebbe sicuramente una solida base e un corso per lo sviluppo.
La mia preoccupazione principale per l'implementazione di Abp
è il potenziale per l'over-engineering e / o lo spreco di tempo nell'implementare tale un framework rigido.
La mia prima domanda è:
- Vale la pena utilizzare
Abp
? Com'è basato sull'esperienza personale, se mai?
Dato che è utile per abbracciare Abp
, vorrei anche sapere:
- In che modo
Abp
può essere integrato nel mio progetto? Devo produrre una struttura di progetto mirror che includa la corrispondente versioneAbp
per ogniAbp
-finito definito?