2010-04-07 2 views
11

Il nostro progetto corrente ha avuto un problema di dipendenza circolare. Il nostro assembly di business logic utilizza classi e metodi statici dal nostro assembly SharedLibrary. SharedLibrary contiene una serie di funzioni di supporto, come una classe di SQL Reader, Enumeratori, variabili globali, gestione degli errori, registrazione e convalida.Soluzione di dipendenza circolare

SharedLibrary deve accedere agli oggetti Business, ma gli oggetti Business devono accedere a SharedLibrary. I vecchi sviluppatori hanno risolto questo ovvio odore di codice replicando la funzionalità degli oggetti di business nella libreria condivisa (molto anti-DRY). Ho passato un giorno a cercare di leggere le mie opzioni per risolvere questo problema, ma sto colpendo un vicolo cieco.

Sono aperto all'idea di riprogettazione dell'architettura, ma solo come ultima risorsa. Quindi, come posso avere una libreria di helper condivisa che possa accedere agli oggetti di business, con gli oggetti business che ancora accedono alla libreria di helper condivisa?

+2

la domanda ovvia è: perché la libreria condivisa bisogno di accedere ai business Objects? Se puoi rispondere, avrai una soluzione. – Aaronaught

+0

SharedLibrary ha una classe di variabile globale astratta riempita con proprietà statiche. Queste proprietà vengono create dai valori del database e quindi dalla necessità di oggetti business, questo è solo un esempio di molti. E naturalmente gli oggetti Business hanno bisogno di accedere a quelle costanti. – gfoley

+2

Ecco perché non uso mai termini vaghi come "condivisi" per descrivere una libreria. Cosa fa in realtà? Ciò che chiami una biblioteca condivisa ha chiaramente troppe responsabilità, e forse anche la libreria degli oggetti business. In genere, queste soluzioni vengono risolte inserendo le classi/interfacce veramente * indipendenti * nella propria libreria. – Aaronaught

risposta

17

È possibile creare un progetto separato solo per oggetti valore (nessuna logica) e interfacce.

le tue classi della libreria condivisa implementare le interfacce, e la Biblioteca business dipendono le interfacce (Ho sentito più verificabili e disaccoppiati codice qui? Per non parlare di rimuovere la dipendenza dalla libreria condivisa).

Idealmente, si potrebbero avere gli oggetti di business su cui la libreria condivisa dipende anche da questo progetto extra. Se gli oggetti business sono troppo complessi, puoi anche trasformarli in interfacce.

Avrete entrambi i progetti non dipendenti gli uni sugli altri, ma solo su un altro progetto con solo oggetti "virtuali" (nessuna logica):

Affari ---> Interfacce e valore oggetti < --- libreria condivisa

Ora quelli sono disaccoppiati =)

+0

Questa è la risposta. – Strelok

+0

Se hai intenzione di andare così lontano per l'architetto di distanza la dipendenza perché fermarsi a 5 metri dal traguardo e non solo architetto di tutto questo? A quel punto non avresti più codice che dipende dalle entità di business e puoi lasciare il codice veramente condiviso nel progetto condiviso. Quale sarebbe la mia risposta. –

+0

@Chris Questo non è un grande cambiamento. Ciò richiederà un po 'di refactoring, ma nessuna riprogettazione o necessità di rimodellare le cose. –

0

Una soluzione sarebbe quella di mettere un modello di facciata in mezzo. Qui eviterai l'accesso diretto/la dipendenza ai tuoi oggetti di business dalla libreria condivisa. Invece, useresti un livello che funge da facciata tra il tuo lib e il tuo BO. In questo modo puoi impacchettare le tue librerie condivise in modo pulito e disaccoppiato.

+1

Direi semplicemente "astrazione" senza specificare il nome del modello concreto (potrebbe essere facilmente adattatore, strategia, bridge) perché l'intento principale dei modelli di progettazione non è la risoluzione di problemi come questo. –

3

Ogni volta che si dispone di una libreria "condivisa" non si deve assolutamente fare riferimento al proprio progetto di entità aziendale. Fare così farà sì che questo problema si verifichi come tu ovviamente vedi.

La soluzione a ciò è rimuovere tutto il codice dipendente dall'entità aziendale dalla libreria condivisa e rearchitect via il bisogno di quel codice di supporto o posizionare quel codice di helper all'interno del progetto entità aziendale stesso.