AutoMapper vs ValueInjecter [zamknięty]

Obecnie pytanie to nie pasuje do naszego formatu pytań i odpowiedzi. Oczekujemy, że odpowiedzi będą poparte faktami, referencjami lub wiedzą specjalistyczną, ale to pytanie będzie prawdopodobnie wywoływało debatę, argumenty, ankiety lub rozszerzoną dyskusję. Jeśli uważasz, że to pytanie można poprawić i ewentualnie ponownie otworzyć, odwiedź Pomoc centrum dla wskazówek. Zamknięty 9 lat temu . zamknięte. To pytanie i jego odpowiedzi są zamknięte , ponieważ pytanie jest off-topic, ale ma znaczenie historyczne. Obecnie nie przyjmuje nowych odpowiedzi ani interakcji.

Za każdym razem, gdy szukam AutoMapper Rzeczy Na StackOverflow, czytam coś o ValueInjecter .

Czy ktoś może mi powiedzieć jakie są za i przeciw (wydajność, funkcje, wykorzystanie API, rozszerzalność, testowanie) ?

Author: Rookian, 2011-01-11

4 answers

Jako twórca ValueInjecter , mogę ci powiedzieć, że zrobiłem to, ponieważ chciałem czegoś prostego i bardzo elastycznego {11]}

Naprawdę nie lubię dużo pisać lub pisać dużo monkey code Jak:

Prop1.Ignore, Prop2.Ignore etc.
CreateMap<Foo,Bar>(); CreateMap<Tomato, Potato>(); etc.

ValueInjecter jest czymś jak mozilla ze swoimi wtyczkami, tworzysz ValueInjections i używasz ich

Istnieją wbudowane zastrzyki do spłaszczania, unflattening i niektóre, które są przeznaczone do dziedziczenia

I działa bardziej w Rodzaj aspektu drogi , nie musisz podawać wszystkich właściwości 1-do-1, zamiast tego robisz coś w stylu:

weź wszystkie właściwości int ze źródła, których nazwa kończy się "Id", przekształć wartość i ustaw każdą NA właściwość w obiekcie źródłowym o tej samej nazwie bez sufiksu Id, a jej typ jest dziedziczony od encji, takie rzeczy

Więc jedna oczywista różnica, ValueInjecter jest używany nawet w formularzach windows z spłaszczeniem i unflattening, to jak elastyczny jest

(mapowanie z obiektu do kontrolek formularza i z powrotem)

Automapper, nie używany w windows forms, nie unflatenning, ale ma dobre rzeczy, takie jak mapowanie kolekcji, więc jeśli potrzebujesz go z ValueInjecter, po prostu zrób coś w stylu:

foos.Select(o => new Bar().InjectFrom(o));

ValueInjecter można również wykorzystać do mapowania obiektów anonymous i dynamic

Różnice:

  • Automapper tworzy konfigurację dla każda możliwość mapowania CreateMap()

  • Valueinjecter inject from any object to any object (istnieją również przypadki, gdy inject from object to valuetype)

  • Automapper ma wbudowane spłaszczenie, i tylko dla prostych typów lub z tego samego typu, i nie ma unflattening

  • Valueinjecter only if you need it you do target.InjectFrom<FlatLoopValueInjection>(source); also <UnflatLoopValueInjection> a jeśli chcesz od Foo.Bar.Name of type String do FooBarName of type Class1 dziedziczysz FlatLoopValueInjection i określasz to

  • Automapper domyślnie mapuje właściwości o tej samej nazwie, a dla reszty musisz określić jeden po drugim i robić rzeczy takie jak Prop1.Ignore (), Prop2.Ignoruj () itd.

  • Valueinjecter ma domyślne wstrzyknięcie .InjectFrom (), które wykonuje właściwości o tej samej nazwie i typie; dla wszystkiego innego tworzysz niestandardową wartość z indywidualną logiką/regułami mapowania, bardziej jak aspekty, np. ze wszystkich właściwości typu Foo do wszystkich właściwości typu Bar

 170
Author: Omu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 21:39:58

Ponieważ nigdy nie używałem żadnego z innych narzędzi, mogę mówić tylko o AutoMapper. Miałem na myśli kilka celów budowy Automapera:

  • Wsparcie spłaszczania do głupich obiektów DTO
  • Obsługa oczywistych scenariuszy po wyjęciu z pudełka(zbiory, wyliczenia itp.)
  • być w stanie łatwo zweryfikować mapowania w teście
  • pozwala na rozwiązywanie przypadków krawędzi w innych miejscach (niestandardowe mapowanie typu - > typ, Indywidualne mapowanie elementów i niektóre naprawdę szalone krawędzie przypadki).

Jeśli chcesz robić te rzeczy, AutoMapper działa bardzo dobrze dla Ciebie. Rzeczy, które Automaper nie robi dobrze to:

  • wypełnianie istniejących obiektów
  • Unflattening

Powodem jest to, że nigdy nie musiałem robić tych rzeczy. W przeważającej części nasze podmioty nie mają seterów, nie wystawiają kolekcji itp. dlatego go tam nie ma. Używamy AutoMapper do spłaszczania do DTOs i mapowania z modeli interfejsu użytkownika do komunikatów poleceń i tym podobnych. Tak to działa bardzo, bardzo dobrze dla nas.

 59
Author: Jimmy Bogard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 02:10:02

Próbowałem obu i wolę ValueInjecter, bo to takie proste:

myObject.InjectFrom(otherObject);
To wszystko, co mogę wiedzieć dla większości moich potrzeb w zakresie zastrzyków. To nie może być prostsze i bardziej eleganckie niż to.
 55
Author: Adrian Grigore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 21:07:03

To jest pytanie, które również badałem, i dla mojego przypadku użycia, wydaje się być valueinjecter ręce w dół. Nie wymaga wcześniejszej konfiguracji do użycia (może trafić w Wydajność, chociaż jeśli zostanie mądrze zaimplementowany, może buforować mapowania dla przyszłych wywołań zamiast odzwierciedlać za każdym razem), więc nie musisz predefiniować żadnych mapowań przed ich użyciem.

Co najważniejsze, umożliwia jednak odwzorowanie odwrotne. Teraz może mi czegoś brakuje, bo Jimmy wspomina, że nie widzi sensu. przypadek, w którym jest to konieczne, więc może mam wzór źle, ale mój przypadek użycia jest to, że tworzę obiekt ViewModel z mojego ORM. Następnie wyświetlam to na mojej stronie internetowej. Gdy Użytkownik skończy, odzyskam ViewModel jako httppost, w jaki sposób zostanie to przekonwertowane z powrotem do oryginalnych klas ORM? Chciałbym znać wzór z automapp. Z ValueInjector jest to trywialne, a nawet unflatten. np. tworzenie nowego podmiotu

Model stworzony przez entityframework (model pierwszy): {]}

public partial class Family
{ 
    public int Id { get; set; }
    public string FamilyName { get; set; }

    public virtual Address Address { get; set; }
}

public partial class Address
{
    public int Id { get; set; }
    public string Line1 { get; set; }
    public string Line2 { get; set; }
    public string TownCity { get; set; }
    public string County { get; set; }
    public string Postcode { get; set; }

    public virtual Family Family { get; set; }
}

ViewModel (który mogę udekorować walidatorami):

public class FamilyViewModel
{
    public int Id { get; set; }
    public string FamilyName { get; set; }

    public int AddressId { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
    public string AddressTownCity { get; set; }
    public string AddressCounty { get; set; }
    public string AddressPostcode { get; set; }
}

ViewController:

    //
    // GET: /Family/Create

    public ActionResult Create()
    {
        return View();
    } 

    //
    // POST: /Family/Create

    [HttpPost]
    public ActionResult Create(FamilyViewModel familyViewModel)
    {
        try
        {
            Family family = new Family();
            family.InjectFrom<UnflatLoopValueInjection>(familyViewModel);
            db.Families.Add(family);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }
Według mnie, to nie jest dużo prostsze niż to?

(więc to nasuwa się pytanie, co jest nie tak ze wzorem, który napotkam na to (i wydaje się, że wiele innych robi), że nie jest postrzegany jako wartość dla AutoMapper?)

Jednak, jeśli ten wzór, jak decscribed, jest taki, którego chcesz użyć, to mój głos jest wart mili kraju.

 27
Author: DanH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-17 21:16:29