Creazione viewmodels dall'albero dell'ereditarietà

0

Ho un'interfaccia di dominio ITransformation con diverse classi di implementazione come RemoveRowsTransformation e AddColumnTransformation . L'albero di ereditarietà modella il modello di comando. L'interfaccia ITransformation definisce un Execute(table) . Ogni classe di implementazione contiene proprietà diverse che è necessario implementare il metodo. Ad esempio:

public class RemoveRowsTransformation : ITranformation {
    public int TopRowsCount { get; private set; }
    public int BottomRowsCount { get; private set; }
    //snip
}

public class AddColumnTransformation : ITranformation {
    public string ColumnName { get; private set; }
    //snip
}

Diversi metodi di dominio richiedono o creano un IEnumerable<ITransformation> . Questa enumerabile deve essere presentata nella vista (inviata come JSON tramite web API, in particolare) per la visualizzazione e la modifica. Come presentare più efficacemente i dati nell'enumerabile di trasformazioni (albero ereditario) nella vista o altrove?

Attualmente, ogni trasformazione concreta sta creando un viewmodel. Questo non mi sta bene, perché in questo modo il dominio è legato al livello vista. Inoltre, se è necessaria una visualizzazione diversa o se viene utilizzato un modello diverso per il salvataggio dei dati nel database, sarà necessario effettuare uno specifico metodo nel dominio per ogni conversione.

Un approccio alternativo che ho usato è quello di creare un'interfaccia che i modelli particolari erediteranno e i modelli di dominio che riempiono tali interfacce. Questo sembra più pulito, ma porta comunque a una grande quantità ingestibile di IDomainClassModel e implementazioni per ogni singola cosa immaginabile.

    
posta bklaric 26.07.2017 - 12:56
fonte

1 risposta

1

Cosa succede se hai iniettato un dizionario nella tua vista che mappa da un tipo concreto di ITransformation alla vista di trasformazione appropriata? Puoi eseguire un'iterazione su IEnumerable<ITransformation> , chiamare GetType() su ciascuno e creare un'istanza della vista corretta per ciascuno di essi utilizzando il dizionario.

Esistono numerosi vantaggi a questo approccio:

  • Il dominio non è abbinato al livello di presentazione
  • Può facoltativamente riutilizzare la stessa vista per più implementazioni concrete di ITransformation senza codice duplicato o design disordinato
  • Può specificare dizionari diversi a seconda del contesto (modifica vs vista, vista riepilogo, vista dettagliata, vista focalizzata, ecc.)
risposta data 26.07.2017 - 22:34
fonte

Leggi altre domande sui tag