2010-08-17 8 views
6

ho due assiemi A & B.circolare riferimento fra due complessi NET

A ha riferimento B esistenti e deve essere tenuto in questo modo. In questo momento ho apportato alcune modifiche a B che devono fare riferimento ad A. Quindi si verifica un riferimento circolare.

un po 'di dettagli:

A ha un paio di griglie di proprietà che ha bisogno di essere ospitato la finestra di dialogo in B. Quindi, per evitare questo problema di riferimento circolare, ho provato a definire le interfacce per le griglie nel terzo assieme a cui si riferiscono sia A & B che fanno riferimento solo alle interfacce.

Due problemi che sto affrontando:

  1. c'è troppa tipi di dati personalizzati (proprietà per essere precisi) all'interno delle griglie che sono definite all'interno di una e devo definire le interfacce per ognuno di loro.

  2. Vedo un esempio di questo funziona con il parametro funzione ad es. funzione di destinazione delle chiamate tramite l'interfaccia passata Ma come adattarlo considerando il seguente codice -. Non posso nuovo un ICustomPropertyGridWrapper ...

    object = new CustomPropertyGridWrapper(...)
    m_property.SelectedObject = object;

+0

B ** richiede ** le classi di A o è più simile a uno scenario di utilizzo predefinito di utilizzare i tipi in B? Se sono strettamente accoppiati, non vedo alcun motivo per mantenerli in assemblee separate. –

risposta

1

Per il rilascio 1, non c'è davvero una soluzione diversa quindi unire i due progetti o fare un po 'di generazione di codice

Per il secondo, si può fare che con l'attuazione del modello di progettazione di fabbrica.

0

refactoring del codice o unire assemblee = don' t usare riferimenti circolari. È un sintomo di un pessimo design.

+2

Un giudizio severo sul design, considerando che non si sa quasi nulla, e nessun vero consiglio ... Non penso che tu ti sia di grande aiuto. – Kobi

+0

Non lo so, ma se controlli altre risposte stanno descrivendo la stessa soluzione: refactoring o unione. Quindi è abbastanza utile. –

+4

Ed è solo un sintomo di un cattivo design. Un buon design può avere sintomi di cattivi disegni, se c'è una giustificazione, ma un buon designer presterà comunque attenzione a quei sintomi e si assicurerà che essi siano veramente giustificati e che rimangano giustificati mentre le cose cambiano. –

3

Sembra che tu stia tentando la morte tramite l'interfaccia. Non tutto deve essere esposto dall'interfaccia.

Una risposta semplice è di unire gli assiemi o spostare i controlli e i tipi di dati comuni in un terzo assieme. Devi solo interfacciare le cose se vuoi un modo contrattuale coerente per accedere o lavorare con le cose, e vuoi nascondere l'implementazione effettiva.

0

Se B ora dipende da bit di un forse si dovrebbe refactoring quei bit fuori in un nuovo gruppo C che possono essere referenziato da A e B.

3

Questo è un problema con il disegno linguaggio C#. In C/C++ si usa semplicemente un'intestazione per definire l'interfaccia dell'unità di compilazione e la dipendenza viene risolta.

In C# non ci sono intestazioni. Sono disponibili tre opzioni

  1. 1> unire le assemblee (aumento del tempo di compilazione e non puoi
    ha senso se gli assembly sono funzionalmente indipendente). C# ti costringe spesso a farlo, anche se gli assiemi dovrebbero essere logicamente separati.
  2. Iniezione di dipendenza
  3. Creazione di un terzo assieme con interfacce di cui fanno riferimento entrambi i moduli.Ciò realizza l'iniezione della dipendenza attraverso un meccanismo di linguaggio C# (interfacce), invece di eseguire il rollover; ma è la stessa cosa

Il numero 3 è in genere come queste situazioni sono gestite in C# ma non è elegante come la soluzione C/C++ a questo problema. Per basi di codice di grandi dimensioni devi progettare dall'inizio con questo in mente.

+0

Non vedo come l'iniezione di dipendenza possa aiutare qui. Hai ancora due assembly che vogliono entrambi un riferimento tra loro. – Vaccano

+0

Buon puntatore sulla limitazione C# di non avere un file di intestazione. Se è così, lo stesso vale per Java. Non è chiaro come DI possa aiutare comunque. Serve un'illustrazione – liang