Restituisce un'entità di dominio ridotta dal tuo modello di vista

5

Mi chiedo come gestire un ViewModel nel senso tradizionale, che include sia le proprietà che i metodi, e un altro "modello di vista" che è semplicemente solo le proprietà - forse il ViewModel restituirebbe un'entità di questa vista ", o qualcosa del genere.

Lasciami spiegare:

Modello di dominio:

public class Workout 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string SomethingElse { get; set; }
    public List<Exercise> Exercises { get; set; }
    public DateTime CreatedDate { get; set; }
}

Visualizza modello:

public class WorkoutHistoryViewModel : IWorkoutHistoryViewModel
{
    private IWorkoutRepository workoutRepository;

    public WorkoutHistoryViewModel(IWorkoutRepository workoutRepository)
    {
        this.workoutRepository = workoutRepository;
    }

    // Here I'd like to return a slimmed down entity, not the full entity
    public IEnumerable<WorkoutHistoryViewEntity> GetExistingWorkouts()
    {
        return this.workoutRepository.GetList(); // some mapping logic
    }
}

E forse la "entità di visualizzazione" desiderata sarebbe semplicemente:

public class WorkoutHistoryViewEntity 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Dovrò anche fare qualcosa di simile per, diciamo, un WorkoutDetailsViewModel , che richiederà un diverso insieme di proprietà per il suo "modello di vista", come:

public class WorkoutDetailsViewEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Exercise> Exercises { get; set; }
}

Quindi, suppongo che le domande siano:

  1. Sto facendo MVVM tutto sbagliato? Questo ViewModel dovrebbe avere anche le proprietà desiderate? Se è così, allora, quando faccio un GetExistingWorkouts() , dovrei davvero restituire un List<WorkoutHistoryViewModel> ? In tal caso, avrei un sacco di oggetti, tutti con repository e metodi, quando in realtà voglio solo i dati.
  2. Se dovessi creare una terza classe, come WorkoutHistoryViewEntity , quali sono in genere chiamati (visto che ViewEntity non sembra proprio corretto).
posta Tom 24.06.2015 - 15:46
fonte

2 risposte

3

Non devi preoccuparti che i tuoi ViewModels abbiano più funzionalità rispetto alla semplice fornitura di dati. Dopotutto, la loro vera funzione - fornire i dati per la visualizzazione e qualsiasi funzionalità richiesta dalla Vista. ViewModel conterrà normalmente proprietà, ICommand, almeno un modello e qualsiasi riferimento a servizi e repository necessari per gestire le modifiche al modello.

Nel tuo caso, il tuo WorkoutHistoryViewModel fornirà un ObservableCollection<WorkoutViewModel> , ognuno dei quali ha un oggetto Workout come modello.

quindi per rispondere alle tue 2 domande:

  1. Stai facendo bene MVVM. Non preoccuparti perché sembra un po 'prolisso - ci sono ragioni per la separazione. E quasi tutti i viewmodels avranno alcuni riferimenti a servizi e dati.
  2. Non creare un "ViewEntity". Basta creare un ViewModel.
risposta data 24.06.2015 - 16:14
fonte
1

Il ritorno di una List<WorkoutHistoryViewModel> non è la via da seguire per me, anche se spesso è fatto. La tua seconda opzione è migliore, e penso che tu abbia capito bene per intuito.

Hai ragione anche se WorkhoutHistoryViewEntity non è un nome appropriato. Potrebbe significare quasi tutto. È difficile trovare un nome per Id e il nome perché il primo è tecnico e il secondo no. Presumo qui che l'ID sia unico e il nome non lo sia. In questo caso, c'è probabilmente un modo per restituire solo un elenco di nomi o un elenco di Id? Questo potrebbe risolvere il tuo problema, perché mi chiedo se ci sia una buona ragione per restituire entrambe le informazioni insieme. Se c'è una buona ragione, dicendoci potrebbe essere più facile trovare un buon nome. Altrimenti puoi anche andare con WorkoutIdAndName .

Se entrambi Id e nome sono univoci, vai con WorkoutReference o WorkoutIdentifier (e usa anche questa classe interna per memorizzare Id e un alias (qui sarebbe il nome)).

    
risposta data 24.06.2015 - 16:16
fonte

Leggi altre domande sui tag