2012-01-19 27 views
12

Używam AutoMapper od kilku miesięcy z powodzeniem, ale teraz mam trochę przeszkodę. To, czego potrzebuję (lub myślę, że potrzebuję), to mapowanie dwukierunkowe. Dzieje się tak, gdy ładuję element z bazy danych, aby odtwarzać na ekranie (obiekt domeny -> model widoku), a gdy użytkownicy wprowadzają zmiany do tego elementu i mapują go z powrotem do mojego obiektu domeny (zobacz model -> obiekt domeny).Co jest nie tak z mapowaniem dwukierunkowym?

Rozumiem, że mogłem po prostu utworzyć mapowanie w moim profilu, aby obsłużyć odwzorowanie dwukierunkowe, ale czytałem here, że mapowanie dwukierunkowe jest niepotrzebne. Wiele osób wskazuje, że taka reakcja jest odpowiedzią na nie naprawienie większego problemu (co to może być).

Po prostu zastanawiam się, dlaczego to jest zapach kodu?

Odpowiedz

11

Kiedy byłem młodszym twórcą, pracowałem nad dużym projektem, który zasadniczo zrobił to, co opisujesz. Nie używaliśmy automappera, ale stworzyliśmy viewmodels, które hermetyzowały obiekty domeny, co w zasadzie oznaczało, że dostałeś swoje zmiany z widoku bezpośrednio do obiektów domeny. Po prostu utrzymuj swoje zmiany i presto są tam, gdzie chcesz je mieć (w bazie danych). Ta aplikacja powinna była zostać wydana cztery lata temu, ale wciąż mają problemy.

Dlaczego to zapach? Cóż, tracisz poczucie, że coś zmieniasz. Intencja jest czymś naprawdę ważnym, ponieważ twoja aplikacja rośnie i staje się bardziej złożona. Trudno wymusić nowe reguły w Twojej domenie, ponieważ trudno jest dokładnie określić, które operacje są prawidłowe w Twojej domenie. Jeśli automatycznie modelujesz swój model domeny, jest on również bardzo anemic.

Jak wskazuje Jimmy, modelujesz swoją domenę zgodnie z wymaganiami swojej domeny, a nie z wymaganiami automatu. Jeśli automapper miałby działać bezpośrednio na twoim modelu, musiałbyś wprowadzić poprawki, takie jak publiczne ustawianie właściwości, chociaż może to nie być dobry pomysł z perspektywy modelowania domeny.

Myślę, że większy problem polega na tym, że model domeny, który może być zautomatyzowany bezpośrednio z viewmodels, nie przekazuje intencji ani nie hermetyzuje w satysfakcjonujący sposób. Jeśli tworzysz małą aplikację, wówczas aktywna architektura stylu rekordu/zestawu danych może nie być zła, ale jeśli rozwiązanie jest skalowane lub złożone, masz większe problemy niż mapowanie z viewmodel do domeny.

W obecnej aplikacji, nad którą pracuję, używamy automappera do mapowania z domeny na dto i z dto do viewmodels. Kiedy coś ma zostać utrwalone, tłumaczymy operację na viewmodels na jawne komendy, które są wykonywane przeciwko tej domenie. Nigdy nie poleciłbym architektury trójwarstwowej w żadnej aplikacji na dużą skalę (cienki lub gruby klient).

+0

Niesamowita odpowiedź. Dziękuję Ci. – Nosila

+0

+1 Dobrze napisane. Nie mogłem się więcej zgodzić. –

+0

Co, jeśli nie ma zamiaru? Powiedzmy, że chcesz odwzorować obiekt domeny na obiekt trwałości w repozytorium. Intencja zmian została już wyrażona na poziomie domeny. W tym przypadku myślę, że mapowanie dwukierunkowe jest prawidłowe. – Guillaume