Design della classe e separazione delle preoccupazioni

2

Sto lavorando su un'applicazione MVC e mi sto interrogando sul modo migliore di progettare uno dei miei modelli.

Ho una classe chiamata RightLeftPersonToggle che rappresenta due caselle di riepilogo selezionate nella pagina. L'utente è in grado di spostare "persone" tra la casella sinistra e quella destra usando i pulsanti tra di loro.

Questa classe può rappresentare sia un driver del veicolo che un gestore, quindi il carico e il codice di salvataggio sono diversi per ogni tipo. La classe è di sotto.

public class RightLeftPersonToggle
{
    public RightLeftPersonToggle()
    {
        LeftList = new List<Person>();
        RightList = new List<Person>();
    }

    public List<Person> LeftList { get; set; }
    public List<Person> RightList { get; set; }
    public string LeftListTitle { get; set; }
    public string RightListTitle { get; set; }
    public string PropertyName { get; set; }
}

Mi chiedo quale sia il modo migliore per gestire il caricamento e il salvataggio degli elenchi. Ho trovato due soluzioni ma non sono sicuro su quale sia il migliore.

1) Il controller (o modello principale) è responsabile del caricamento e salvataggio di LeftList e RightList. La classe RightLeftPersonToggle non ha alcuna conoscenza di quel codice e rimane esattamente come il codice precedente.

2) RightLeftPersonToggle ottiene due metodi (uno per il salvataggio e uno per il caricamento) che prendono le funzioni come parametri per dirgli come fare il suo lavoro.

public void LoadAndFilterLists(Func<List<Person>> leftListFilter, Func<List<Person>> rightListFilter)

public void LoadSaveLists(Func<List<Person>> leftListSave, Func<List<Person>> rightListSave)

La soluzione numero uno mantiene il codice più semplice a mio parere, mentre la soluzione numero due sembra fornire una migliore seprazione delle preoccupazioni dal momento che RightLeftPersonToggle dovrebbe sapere come caricare e salvare se stesso.

Tenendo presente il fatto che RightLeftPersonToggle non carica sempre e salva i dati allo stesso modo, quale delle mie soluzioni proposte sarebbe considerata una best practice? Avete altri consigli per il miglioramento?

    
posta Mike 09.08.2011 - 16:55
fonte

3 risposte

3

Se la logica necessaria per salvare i dati varia a seconda di cosa viene mostrato negli elenchi, è necessario che il controllore gestisca il salvataggio degli elenchi. Il codice che hai mostrato sembra essere per la tua vista, quindi tutto ciò di cui dovresti preoccuparti è la visualizzazione degli elenchi e non dovrebbe aver bisogno di sapere cosa c'è in essi. Lascia che il controller capisca quale tipo di dati sia presente nelle 2 liste e quale sarebbe la logica di salvataggio appropriata.

    
risposta data 09.08.2011 - 17:31
fonte
2

In un senso più generale, vorrei che le mie classi lavorative rappresentassero le relazioni del mondo reale. Quando una persona non tecnica parla di una persona, sta davvero parlando della lista sinistra di una persona e della lista a destra? O è più una relazione gerarchica?

L'uso di caselle di elenco e tali è una preoccupazione dell'interfaccia utente. L'interfaccia utente sarà responsabile della presa del set di caselle di riepilogo e di altri elementi di input e del loro mapping sugli oggetti con cui il modello di dominio può lavorare.

Personalmente, cerco di evitare di esporre il mio modello di dominio all'interfaccia utente, quindi utilizzo un livello di servizio che gestisce la mappatura tra le mie entità e i DTO con cui interagisce l'interfaccia utente. Il livello di servizio effettua anche chiamate al repository e mi sforzo di mantenere tutta la mia logica aziendale nelle mie entità.

L'interfaccia utente di ASP.NET MVC acquisisce i DTO e li mappa per visualizzare i modelli e le viste vengono strongmente digitate per i modelli di visualizzazione specifici della vista. I modelli di visualizzazione hanno consapevolezza dei componenti dell'interfaccia utente come SelectList ma non DTO o entità. I controller sono il più sottili possibile e coordinano le chiamate di servizio e restituiscono visualizzazioni / reindirizzamenti.

    
risposta data 09.08.2011 - 17:33
fonte
1

Ho due idee, una che ho cancellato e la seconda che preferisco.

  1. La mia idea non favorita: perché non creare due sottoclassi di RightLeftPersonToggle , una per VehicleDriver e una per Manager e l'implementazione della funzionalità Salva / Carica in quelle sottoclassi? La classe Genitore è responsabile della creazione del giusto tipo di classe in base al tipo di oggetti con cui tratta.

  2. La mia seconda idea è che la tua classe RightLeftPersonToggle accetti qualcosa come IPersonRepository nel costruttore e chiama _personRepository.Save e _personRepository.Load all'interno della classe RightLeftPersonToggle . Mantiene il codice separato, ma consente comunque di chiamarlo dall'oggetto che è stato ripresentato per esso.

risposta data 09.08.2011 - 17:29
fonte

Leggi altre domande sui tag