Domanda

Prendi in considerazione una normale applicazione per gli ordini dei clienti basata sul modello MVC usando WinForms. La parte della vista è cresciuta troppo (oltre 4000 file) e deve essere suddivisa in più piccoli.


Per questo esempio utilizzeremo 3 progetti per la parte vista:

  • Principale - ha dipendenze dagli altri 2 progetti. Crea un'istanza dei moduli con gli elenchi.
  • Clienti - ha 2 moduli: elenco clienti e dettagli cliente.
  • Ordini - ha 2 moduli - elenco ordini e dettagli ordine.

Nel modulo dei dettagli del cliente c'è anche un elenco di ordini per quel cliente. L'elenco viene ricevuto da OrdersController, quindi non è un problema ottenerlo. Quando l'utente seleziona un ordine, l'elenco otterrà il suo guid e lo passerà come riferimento al modulo Dettagli ordine.

Ciò significherebbe che dobbiamo avere un riferimento al Progetto Ordini nel Progetto Clienti. (1)

Ma anche sul modulo dei dettagli dell'ordine è presente un collegamento al cliente che ha effettuato l'ordine. Quando si fa clic, dovrebbe aprire il modulo Dettagli cliente.

Ciò significherebbe che dobbiamo avere un riferimento al Progetto Clienti nel Progetto Ordini. (2)

Da (1) e (2) avremo dipendenze cicliche tra i progetti Ordini e Clienti.


Come può essere evitato? Qualche tipo di architettura plug-in? Il progetto è già stato sviluppato e la soluzione migliore comporterebbe il minor cambio di codice possibile.

È stato utile?

Soluzione

Cambia almeno uno dei tipi in un'interfaccia.

Ad esempio avere un'interfaccia ICustomer e un tipo Cliente che implementa questa interfaccia. Ora aggiungi ICustomer al progetto ordini e dal progetto clienti imposta un riferimento al progetto Ordini in modo da poter implementare l'interfaccia. Il tipo Ordine ora può funzionare con il tipo ICustomer senza conoscere l'implementazione effettiva.

E per una soluzione migliore :-) Crea un'interfaccia ICustomer e IOrder e aggiungili a un terzo progetto di libreria. E fai riferimento a questo progetto dagli altri due e lavora solo con le interfacce, mai con l'implementazione.

Altri suggerimenti

Se sono così strettamente accoppiati forse non dovrebbero essere divisi.

Estrai le interfacce e inseriscile in un assieme separato. Dal momento che stai usando l'architettura MVC, non dovrebbe essere difficile. Dai un'occhiata al blocco Applicazioni dell'interfaccia utente composita di Microsoft per esempi e buone pratiche.

Penso che il tuo problema principale non sia l'architettura della tua applicazione. Devi capire i confini e come dividere la funzionalità tra loro. La divisione come la tua è abbastanza artificiale, provi a dividere l'applicazione in base agli oggetti del dominio. Prova a utilizzare i ruoli utente o i temi funzionali per farlo e il problema potrebbe scomparire.

Dal punto di vista tecnico non capisco perché le tue opinioni debbano essere consapevoli l'una dell'altra esistenza - mi sembra un po 'strano. Non hai intenzione di dividere i tuoi dati e la tua logica aziendale e alla fine della giornata un GUID è solo una puntura che potresti facilmente passare attraverso metodi diversi.

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