Za każdym razem, gdy szukam rzeczy AutoMapper na StackOverflow, czytam coś o ValueInjecter .
Czy ktoś może mi powiedzieć zalety i wady między nimi (wydajność, funkcje, wykorzystanie interfejsu API, rozszerzalność, testowanie)?
Za każdym razem, gdy szukam rzeczy AutoMapper na StackOverflow, czytam coś o ValueInjecter .
Czy ktoś może mi powiedzieć zalety i wady między nimi (wydajność, funkcje, wykorzystanie interfejsu API, rozszerzalność, testowanie)?
Odpowiedzi:
jako twórca ValueInjecter mogę powiedzieć, że to zrobiłem, ponieważ chciałem czegoś prostego i bardzo elastycznego
Naprawdę nie lubię pisać dużo ani pisać
monkey code
takich jak:ValueInjecter to coś w rodzaju mozilli z wtyczkami, tworzysz ValueInjections i używasz ich
są wbudowane zastrzyki do spłaszczania, spłaszczania i niektóre, które mają być dziedziczone
i działa bardziej pod względem aspektu , nie musisz określać wszystkich właściwości od 1 do 1, zamiast tego robisz coś takiego:
weź wszystkie właściwości int ze źródła, którego nazwa kończy się na „Id”, przekształć wartość i ustaw każdą z nich na właściwość w obiekcie źródłowym o tej samej nazwie bez sufiksu Id, a jej typ jest dziedziczony z Entity, takie rzeczy
więc jedną oczywistą różnicą jest to, że ValueInjecter jest stosowany nawet w formach okien ze spłaszczaniem i spłaszczaniem, jest to tak elastyczne
(mapowanie od obiektu do formantów i odwrotnie)
Automapper, nieużywany w formularzach Windows, bez rozpakowywania, ale ma dobre rzeczy, takie jak mapowanie kolekcji, więc na wypadek, gdybyś potrzebował go za pomocą ValueInjecter, po prostu robisz coś takiego:
foos.Select(o => new Bar().InjectFrom(o));
możesz także użyć ValueInjecter do mapowania z anonimowych i dynamicznych obiektów
różnice:
automapper utwórz konfigurację dla każdej możliwości mapowania CreateMap ()
valueinjecter wstrzykuje z dowolnego obiektu do dowolnego obiektu (zdarzają się również przypadki, gdy wstrzykujesz z obiektu na typ wartości)
automapper ma wbudowane spłaszczanie, i tylko dla prostych typów lub tego samego typu, i nie ma spłaszczania
valueinjecter tylko wtedy, gdy jest to potrzebne to zrobić
target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection>
, a jeśli chcesz odFoo.Bar.Name of type String
doFooBarName of type Class1
was dziedziczyć FlatLoopValueInjection i określić tenautomapper domyślnie odwzorowuje właściwości o tej samej nazwie, a przez resztę musisz określać jeden po drugim i robić takie rzeczy jak Prop1.Ignore (), Prop2.Ignore () itp.
valueinjecter ma domyślny zastrzyk .InjectFrom (), który wykonuje właściwości o tej samej nazwie i typie; dla wszystkiego innego, co tworzysz niestandardowe wtryski wartości z indywidualną logiką / regułami mapowania, bardziej podobne aspekty, np. od wszystkich rekwizytów typu Foo do wszystkich rekwizytów typu Bar
źródło
<pedant>
Wygląda fajnie, ale może powinien to być ValueInjectOr?</pedant>
Ponieważ nigdy nie korzystałem z żadnego z innych narzędzi, mogę mówić tylko o AutoMapper. Miałem kilka celów do zbudowania AutoMapper:
Jeśli chcesz to zrobić, AutoMapper działa dla Ciebie bardzo dobrze. Co AutoMapper nie radzi sobie dobrze to:
Powodem jest to, że nigdy nie musiałem robić tych rzeczy. W przeważającej części nasze podmioty nie mają ustawiaczy, nie ujawniają kolekcji itp., Dlatego nie ma ich tam. Używamy AutoMapper do spłaszczania do DTO i mapowania z modeli interfejsu użytkownika w celu wydawania poleceń i tym podobnych. Właśnie tam to działa naprawdę, bardzo dobrze dla nas.
źródło
Próbowałem obu i wolę ValueInjecter, ponieważ jest to takie proste:
To wszystko, co trzeba wiedzieć o ogromnej większości moich potrzeb związanych z zastrzykami. Nie może być prostszy i bardziej elegancki niż ten.
źródło
this object
metoda rozszerzenia tam?InjectFrom()
metodę rozszerzenia.To pytanie też badam, a dla mojego przypadku użycia wydaje się to bardzo przydatne. Nie wymaga wcześniejszej konfiguracji (wydaje mi się, że może obniżyć wydajność, chociaż inteligentnie zaimplementowany może buforować odwzorowania dla przyszłych wywołań, a nie odzwierciedlać za każdym razem), więc nie musisz predefiniować żadnych odwzorowań przed ich użyciem.
Najważniejsze jednak, że umożliwia odwrotne mapowanie. Teraz może coś mi brakuje, ponieważ Jimmy wspomina, że nie widzi przypadku użycia, w którym jest to konieczne, więc może mam błędny wzór, ale moim przypadkiem użycia jest to, że tworzę obiekt ViewModel z mojej ORM. Następnie wyświetlam to na mojej stronie internetowej. Kiedy użytkownik skończy otrzymam ViewModel z powrotem jako httppost, w jaki sposób zostanie to przekonwertowane z powrotem do oryginalnych klas ORM? Chciałbym poznać wzór z automapper. Z ValueInjector jest to banalne, a nawet się spłaszczy. np. Utworzenie nowego bytu
Model utworzony przez bytframework (najpierw model):
ViewModel (który mogę ozdobić za pomocą walidatorów):
ViewController:
Moim zdaniem nie jest to prostsze?
(To nasuwa pytanie, co jest nie tak ze wzorcem, na który się natknąłem (i wydaje się, że robi to wielu innych), że nie jest postrzegane jako wartość dla AutoMapper?)
Jeśli jednak ten wzór, jak opisano, jest tym, którego chcesz użyć, to mój głos jest wartościowy w przeliczeniu na milę kraju.
źródło