Generyczne mapowanie danych z bazy danych

0

Chciałbym mieć możliwość zrobienia czegoś takiego:

var users = repo.GetUsers<UserViewModel>(); // powinno być typu IEnumerable<UserViewModel>
var anotherUsers = repo.GetUsers<AnotherUserViewModel>(); // powinno być typu IEnumerable<AnotherUserViewModel>

Skorzystałem więc z AutoMapper. Repozytorium wygląda tak:

public IEnumerable<T> GetUsers<T>()
{
    Mapper.Initialize(cfg =>
         cfg.CreateMap<IQueryable<User>, IQueryable<T>>());

    return OnConnect<IEnumerable<T>>(db =>
    {
        return db.Users.ProjectTo<T>().ToList();
    });
}

Za pierwszym razem zadziała, za drugim nie. No w końcu inicjalizację muszę zrobić tylko raz. Wyglądałoby to wtedy tak:

Mapper.Initialize(cfg => {
    cfg.CreateMap<User, UserViewModel>();
    cfg.CreateMap<User, AnotherUserViewModel>();
    ...
    cfg.CreateMap<User, BlablaUserViewModel>();
});

No i jeśli w projekcie mam 100 viewModeli, to muszę dodać 100 linii kodu? Nie da się tego zrobić prościej? Po co w ogóle jest ta inicjalizacja? Nie mogę w jednej linii wskazać z jakiego typu na jaki ma zamienić?

0

Po pierwsze to doczytaj dokładniej dokumentację automappera:

If you’re using the static Mapper method, configuration should only happen once per AppDomain.

Po drugie - co to znaczy "nie działa"?

Po trzecie:

Po co w ogóle jest ta inicjalizacja? Nie mogę w jednej linii wskazać z jakiego typu na jaki ma zamienić?

AutoMapper nie ma kryształowej kuli, z której dowie się jake reguły mapowań ma zastosować - musisz mu je podać w konfiguracji.

0

pierwsza rzecz
http://commitandrun.pl/2016/05/11/Repozytorium_najbardziej_niepotrzebny_wzorzec_projektowy/
czytac i przestac robic herezje z tym repozytorium

druga rzecz, inicjalizuj automappera gdzies w Startup.cs czy ogolnie w kodzie gdzie bedzie wykonywal sie raz na cale zycie aplikacji
a profile tworz w osobnej klasie

trzecia rzecz,
100 viewModeli, to muszę dodać 100 linii kodu
odpowiadajac na pytanie. Tak zle zrozumialem pytanie

Ale napisze doprezycowanie, Po cholere mapujesz viewmodel? Automapper glownie sluzy do mapowania obiektow DTO do obiektow serwisowych (tam gdzie masz logike domenowa).
Podaj prosze powod, dlaczego masz mapowac viewmodel na inny viewmodel. Albo w ogole przyklad do ktorego porrzebujesz mapowac viewmodel

0
fasadin napisał(a):

trzecia rzecz,
100 viewModeli, to muszę dodać 100 linii kodu
odpowiadajac na pytanie. Tak

NIE!... No, chyba że nie umiesz wygenerować typu generycznego w pętli....

Automapper glownie sluzy do mapowania obiektow DTO do obiektow serwisowych (tam gdzie masz logike domenowa).

Co...? ;O

Repository, które mapuje na ViewModele. Fajnie... ;)

0

A czemu nie użyć CreateMissingTypeMaps?
Tzn. nie wiem czy zadziała, ale jeśli zadziała, to rozwiąże problem...

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