Sembra che tu sia caduto in alcune delle insidie 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. Innanzitutto possiamo separare la logica di controllo (le regole aziendali, il codice di accesso ai dati, il codice dei diritti utente, tutto quel genere di cose) dal codice dell'interfaccia utente. In secondo luogo, possiamo suddividere il codice dell'interfaccia utente in blocchi.
Quindi faremo prima l'ultima parte, suddividendo l'interfaccia utente in blocchi. Il modo più semplice per farlo è quello di avere un unico modulo host su cui componi l'interfaccia utente con controlli utente. Ogni controllo utente sarà responsabile di una regione del modulo. Immagina quindi che la tua applicazione avesse un elenco di utenti e quando fai clic su un utente una casella di testo sotto viene riempita con i suoi dettagli. Si potrebbe 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 gestire la comunicazione tra i controlli. Non si desidera 30 controlli utente nel modulo, tutti in modo casuale con riferimenti reciproci e metodi di chiamata su di essi.
Quindi crei un'interfaccia per ogni controllo. L'interfaccia contiene le operazioni che il controllo accetterà e tutti gli eventi che genera. Quando pensi a questa app, non ti importa se la selezione dell'elenco della casella di riepilogo 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 casella di riepilogo degli utenti includerebbe un evento chiamato UserChanged che trasmette un oggetto utente.
Questo è fantastico perché ora se ti annoi della casella di riepilogo e desideri un controllo 3D Magic Eye zoomy, 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 ben usurato e ti consiglio di guardare qui il modello MVP. È 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 ciò che stiamo aggiungendo è il modello e il presentatore.
Il modello contiene la logica che gestisce lo stato dell'applicazione. Sai tutto, andrebbe nel database per ottenere gli utenti, scrivere nel database quando aggiungi 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 si passa al presentatore usando l'interfaccia di cui abbiamo discusso in precedenza.
Il presentatore non deve avere una propria interfaccia, ma mi piace crearne uno comunque. Rende esplicito ciò che vuoi che il presentatore faccia.
Quindi il presentatore esponerebbe metodi come ListOfAllUsers che la vista userebbe per ottenere il suo elenco di utenti, in alternativa, potresti mettere un metodo AddUser la vista e chiamarlo dal presentatore. Preferisco quest'ultima. In questo modo il relatore può aggiungere un utente alla casella di riepilogo ogni volta che lo desidera.
Il Presenter avrebbe anche proprietà come CanEditUser, che tornerà vero se l'utente selezionato può essere modificato. La vista quindi lo interrogherà ogni volta che deve saperlo. Potresti volere quelli modificabili in nero e leggere solo quelli in grigio. Tecnicamente questa è una decisione per la vista in quanto focalizzata sull'interfaccia utente, se l'utente è modificabile in primo luogo è per il presentatore. Il presentatore lo sa perché parla al Modello.
Quindi, in sintesi, utilizzare MVP. Microsoft fornisce qualcosa chiamato SCSF (Smart Client Software Factory) che utilizza MVP nel modo che ho descritto. Fa anche molte altre cose. È abbastanza complesso e non mi piace il modo in cui fanno tutto, ma può aiutare.