Come evitare la duplicazione della logica su due WinForm simili?

Ho due forms, forma A e forma B. Queste forms devono differire in apparenza, ma condividono molta logica. Il problema è che questa logica è legata all’aspetto (convalida sul clic del pulsante, eventi in corso di triggerszione, ecc.). Ad esempio, ho un campo nome e quando si preme il pulsante Salva, devo triggersre un evento che fa sì che il modulo padre convalidi il nome del record per evitare duplicati. Entrambe le forms hanno bisogno di questa logica, ma i loro pulsanti di salvataggio si trovano in posizioni diverse, e il tooltip che viene mostrato quando si verifica un errore deve anche apparire in un posto diverso. Questo è solo un esempio, ma qualcuno sa di un modo in cui posso evitare di copiare e incollare il codice qui? Forse mi manca qualcosa di ovvio …

È ansible creare un object con dati rappresentati in entrambi i moduli e inserire la logica di convalida in quell’object. Il livello di presentazione dovrebbe popolare quell’object con i dati immessi, chiedere all’object di convalidare se stesso e quindi gestire gli errori di convalida in un modo specifico del modulo.

Se la logica comune è relativa all’interfaccia utente, è necessario creare una class di modulo personalizzata (che erediti dalla class Form) con la logica desiderata. allora tutto ciò che devi fare è ereditare quella class nelle tue forms.

Se la logica comune è meno legata all’interfaccia utente, crea una class interna che incapsula la logica comune e chiamala da entrambe le forms.

È necessario aggiungere un controller tra le 2 viste e il modello condiviso. In questo modo devi solo fare: myController.save (); invece di chiamarti object modello per salvarli in entrambe le winform.

Ci sono alcuni modi in cui posso pensare di refactoring queste forms per condividere la logica. Potresti usare uno o più di questi in congiunzione:

  1. Crea oggetti “bean” specifici dell’interfaccia utente che avvolgono il tuo object business e aggiungono funzionalità aggiuntive condivise tra i moduli. Questo bean può fare cose come creare suggerimenti sugli strumenti, aiutare con la validazione, l’eventing, ecc.
  2. Crea una class helper con funzioni comuni. Generalizza la logica sui due moduli per chiamare questa class helper per le funzioni comuni.
  3. Migliora i tuoi oggetti di business per fare la tua convalida. Non intendo dire che i tuoi BO dovrebbero essere a conoscenza di un’interfaccia utente, ma potrebbero / dovrebbero applicare le regole aziendali. Ciò potrebbe trascinare parte della logica di validazione dai moduli e in una posizione comune.
  4. Creare controlli personalizzati specifici per il tipo di dati con cui si sta lavorando e utilizzare tali controlli nei due moduli.

Potresti anche dare un’occhiata al CSLA Framework , l’ho usato con successo in progetti passati per aiutare a ridurre la quantità di codice duplicato tra diverse UI. Sfrutta le capacità di database di .NET, ma non penso che sia necessario utilizzare il databinding per ottenere il massimo dal framework.