Mapowanie modelu na ViewModel i na odwrót

0

Cześć, jakiś czas temu zasiadłem do nowej apki, z chęcią zrobienia kilku rzeczy inaczej. I teraz tak

  • używam EfCore
  • na widokach chcę używać tylko ViewModeli

To powoduje pewien zgrzyt. Mam jedno rozwiązanie, ale nie wydaje mi się do końca poprawne. A więc sytuacja wygląda tak:

  • widok pobiera listę użytkowników z viewmodelu. Każdy użytkownik też jest ViewModelem (a właściwie takim bardziej DTOsem), coś w stylu:
public class UserViewModel
{
  User model;

  public UserViewModel(User model)
  {
      this.model = model;
  }

  public int Id { get { return model.Id; }}
  public string Name
  {
       get { return model.Name; }
       set
       {
          if(model.Name != value)
             model.Name = value;
       }
  }
}

public class UserListViewModel: BaseViewModel
{
  public ObservableCollection<UserViewModel> DataSet {get; set;}

  public async Task InitializeViewModel()
  {
     ObservableCollection<User> models = await service.GetUsersAsObservable();
  }
}

I teraz zaczyna się zabawa... Pobieram z serwisu kolekcję observable -> daje mi to EfCore, dzięki czemu dokładnie wie później, co pozmieniać podczas dbContext.Save

Ale skoro serwis daje mi kolekcję modeli, muszę je jakoś zmienić na ViewModele. A jeśli dodam/usunę jakiś rekord, muszę to od razu ogarnąć w modelu, np:

//collection change od DataSet:
//dodawanie:
  models.Add(ConvertViewModelsToModels(addedViewModels));

//usuwanie
  models.Remove(removedViewModel.GetModel());

Co oznacza, że muszę synchronizować ze sobą dwie listy. Czy takie podejście jest ok? Czy można to zrobić lepiej/inaczej?

0

Nie znam się na efCore, ale wyglada to coś na kształt CQRS. W takim podejściu masz view modele skrojone pod konkretny widok, natomiast zawierają one więcej danych niż model domenowy. Do zapisu powinieneś używać modelu domenowego. View model powinien sie odświeżyć „automatycznie” - aby zbudować taki model pod spodem leci np. zapytanie SQL z joinami.

Nie wiem jak to zrobić w efCore, ale taki jest koncept. Cudów nie ma :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1