Sembra che tu ti sia imbattuto in alcuni dei problemi più comuni, ma non preoccuparti, possono essere risolti:)
Per prima cosa devi guardare la tua applicazione in modo leggermente diverso e iniziare a scomporla in blocchi. Possiamo dividere i pezzi in due direzioni. Per prima cosa possiamo separare la logica di controllo (le regole aziendali, il codice di accesso ai dati, il codice dei diritti degli utenti, tutto quel genere di cose) dal codice dell'interfaccia utente. Secondo, possiamo suddividere il codice dell'interfaccia utente in blocchi.
Quindi faremo l'ultima parte prima, rompendo l'interfaccia utente in blocchi. Il modo più semplice per farlo è quello di avere un singolo modulo host su cui componi la tua interfaccia utente con usercontrols. Ogni controllo utente sarà responsabile di una regione del modulo. Immagina quindi che la tua applicazione abbia un elenco di utenti e quando fai clic su un utente, una casella di testo sotto viene riempita con i loro dettagli. Potresti avere un controllo utente che gestisce la visualizzazione dell'elenco utenti e un secondo che gestisce la visualizzazione dei dettagli dell'utente.
Il vero trucco qui è come gestisci la comunicazione tra i controlli. Non vuoi che 30 controlli utente nel modulo tengano tutti i riferimenti a caso e chiamino metodi su di essi.
Quindi crei un'interfaccia per ogni controllo. L'interfaccia contiene le operazioni che il controllo accetterà e gli eventi che solleverà. Quando pensi a questa app, non ti importa se la lista di caselle di elenco cambia, sei interessato al fatto che un nuovo utente è cambiato.
Quindi, usando la nostra app di esempio, la prima interfaccia per il controllo che ospita la listbox di utenti includerebbe un evento chiamato UserChanged che passa un oggetto utente all'esterno.
Questo è fantastico perché ora se ti annoi della listbox e vuoi un controllo magico occhio zoomy 3D, basta codificarlo sulla stessa interfaccia e collegarlo:)
Ok, quindi parte seconda, separando la logica dell'interfaccia utente dalla logica del dominio. Bene, questo è un percorso logoro e ti consiglio di guardare lo schema MVP qui. È davvero semplice.
Ogni controllo ora è chiamato View (V in MVP) e abbiamo già coperto la maggior parte di ciò che è necessario sopra. In questo caso, il controllo e un'interfaccia per esso.
Tutto quello che stiamo aggiungendo è il modello e il presentatore.
Il modello contiene la logica che gestisce lo stato dell'applicazione. Conoscendo le cose, andrebbe nel database per ottenere gli utenti, scrivere nel database quando si aggiunge un utente e così via. L'idea è che puoi testare tutto questo in completo isolamento da tutto il resto.
Il presentatore è un po 'più complicato da spiegare. È una classe che si trova tra il modello e la vista. Viene creato dalla vista e la vista passa al presentatore tramite l'interfaccia che abbiamo discusso in precedenza.
Il presentatore non deve avere la propria interfaccia, ma mi piace crearne uno comunque. Rende ciò che vuoi che il presentatore faccia esplicito.
Quindi il relatore esporrà metodi come ListOfAllUsers che la vista userebbe per ottenere il suo elenco di utenti, in alternativa, potresti inserire un metodo AddUser nella vista e chiamarlo dal presentatore. Preferisco quest'ultimo. In questo modo il presentatore può aggiungere un utente alla listbox quando vuole.
Il Presenter avrebbe anche proprietà come CanEditUser, che restituiranno true se l'utente selezionato può essere modificato. La vista quindi interrogherà ogni volta che ha bisogno di sapere. Potresti volere quelli modificabili in nero e leggerne solo quelli in grigio. Tecnicamente questa è una decisione per la Vista, poiché è incentrata sull'interfaccia utente, indipendentemente dal fatto che l'utente sia modificabile, in primo luogo per il Presenter. Il presentatore sa perché parla con il Modello.
Quindi, in sintesi, usa MVP. Microsoft fornisce qualcosa chiamato SCSF (Smart Client Software Factory) che utilizza MVP nel modo in cui ho descritto. Fa anche molte altre cose. È piuttosto complesso e non mi piace il modo in cui fanno tutto, ma può essere d'aiuto.