Domanda

In teoria in architettura a strati è possibile avere più moduli sullo stesso livello. Può questo moduli croce di riferimento gli uni agli altri? Is è possibile tecnicamente, ad es. utilizzando .NET?

È stato utile?

Soluzione

E 'certamente possibile farlo, basta stare attenti a non introdurre eventuali dipendenze cicliche tra i moduli. In generale, i moduli in un dato strato dovrebbe dipendere solo altri moduli dello stesso livello o dagli strati sottostanti. I moduli non devono essere consapevoli degli strati sovrastanti.

Se si vuole fare questo ancora più severi, allora si può anche limitare le dipendenze da altri moduli della stessa o di altri strati immediatamente sotto a quello attuale.

Mantenendo l'interfaccia esposta al minimo, ad esempio esponendo solo un nucleo di interfacce pubbliche, oggetti di valore, ed eccezioni è sempre una buona idea. È possibile utilizzare le funzioni di controllo di accesso del linguaggio (vale a dire / pacchetto / pubblico privato) per limitare la visibilità dei meccanismi interni di moduli da versare in altri livelli.

Altri suggerimenti

Tecnicamente si può attraversare riferimento in qualsiasi direzione che si desidera in .NET (non ci sono limiti tecnici per un DAL fare riferimento a un componente di interfaccia utente, anche se non può essere una buona idea). Non vedo problemi con riferimento moduli all'interno dello stesso strato.

Ma dobbiamo guardare alla parola "layer" un po ', dal momento che gli strati sono disponibili in diverse forme e dimensioni. Spesso quando usiamo la parola "layer" pensiamo che l'accesso ai dati di livello o Presentation Layer, e noi di solito permettiamo strati guardano verso il basso, ma non upwars.

In ogni strato, i diversi moduli consentono spesso anche stessi essere organizzati in strati, logicamente. La stessa regola si applica qui; un modulo può guardare dall'alto in basso, ma non all'altezza. Con questo in mente si sente piuttosto sicuro per fare riferimento moduli all'interno dello stesso strato (esterno).

Basta che non hanno due moduli di riferimento tra loro, direttamente o indirettamente. Se si scopre che A e B sia bisogno di funzionalità gli uni dagli altri (che indica che A e B sono sullo stesso livello), si avrà probabilmente bisogno di refactoring del codice, forse l'introduzione di un nuovo modulo C, logicamente posto sotto A e B che entrambi di essi possono utilizzare.

Anche tenere a mente per mantenere i moduli distaccato possibile; meno si conoscono tra di loro, tanto meglio.

come ha detto Pavel, stare attenti con le dipendenze cicliche. Se proprio non può vivere senza una dipendenza ciclica (quello che si chiama cross reference), le classi devono essere non solo dallo stesso 'layer', ma anche la stessa assemblea.

Detto, non ci dovrebbe essere ragione per riferimenti incrociati -. Non solo dovrebbe (come detto pavel) Moduli dipende soltanto sugli strati sottostanti, che unidirezionale dipendenza dovrebbe esistere in tutti i casi

Ci sono alcune eccezioni a questa regola logiche, ad esempio in qualcosa di simile a un modello di dominio - un cliente avrà un numero di ordini, dire. Può essere utile in questo caso (specialmente con ORM etc) per avere una lista di ordini per il cliente, e un riferimento per il cliente da ogni ordine. In termini di unità di funzionalità come i servizi, ecc, ci dovrebbe essere un solo modo dipendenze.

Un modo per aggirare questo problema è quello di utilizzare Inversion of Control attraverso Windsor, autofac, spring.net ecc È possibile definire un'interfaccia in un assieme e un altro oggetto che consuma una realizzazione concreta di tale interfaccia. Un'altra libreria potrebbe contenere l'effettiva esecuzione (il che significa che insieme deve riferimento al primo gruppo). In questo caso, il contenitore IoC afferra l'attuazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top