2009-05-15 19 views
5

Lubię czysto oddzielać obiekty publiczne i domeny od obiektów (tak, nHibernate nie pomoże tutaj) od siebie, co zmusza mnie do napisania dużej ilości kodu do odwzorowania jednego obiektu na inne. Jakie narzędzia/wtyczki są dostępne, aby wziąć nudę z konieczności ręcznego wykonywania tego mapowania w .NET? M Zawsze gdy to robię Google, to myślę, że chcę zrobić ORM, który jest nie czego szukam . Dzięki!Narzędzie do mapowania obiektów do obiektów

EDYCJA 19: 33CST: OK, napisałem bardzo prostą aplikację (bardzo szybko napisany kod), która pokazuje, czego szukam. Zastanawiam się tylko, czy istnieje wtyczka VS, która zrobi to za mnie.

VS2008 Solution

+0

Dla dobra tego pytania, dlaczego szukasz rozwiązania do statycznego generowania kodu, które prawdopodobnie doprowadzi do kłopotliwych testów, zamiast rozwiązań infrastruktury niższego poziomu, takich jak AutoMapper? – MotoWilliams

+0

Być może użycie [języka] (http://ruby-lang.org/) z silnym wsparciem meta-programowania byłoby odpowiednie? Właściwe narzędzie do właściwej pracy, co? – stevenharman

Odpowiedz

6

Tak, pozornie niezadowolony z rozwiązania środowiska wykonawczego, napisałem małe narzędzie, które utworzy mapowania w kodzie. Możesz pobrać poniższe źródło i napisać lepszą obsługę błędów itd., Itp. Byłbym wdzięczny za wszelkie fajne modyfikacje, które zrobiłeś, zrobiono to w pośpiechu, ale działa. Szanuj, że kod jest wydany pod numerem LGPL.

Object To Object Mapping Utility Source Code

UPDATE 23 czerwca 2009: Zrobiłem kilka aktualizacji do kodu, który posprzątał (trochę), a także dodano możliwość zapisania mapowanie do pliku, dzięki czemu można później modyfikować to.

+0

Znalazłem to przydatne, ale chciałem wprowadzić pewne zmiany. Przesłałem go na https://github.com/Swoogan/otom. Tylko uwaga, nie masz licencji ani informacji o prawach autorskich w oryginalnym pliku ZIP. – Swoogan

+0

@Swoogan Wow! Napisałem to dawno temu. Cieszę się, że okazało się to przydatne! Dzięki za heads-up. –

14

Możesz chcieć dać AutoMapper spróbować. To brzmi jak to, czego szukasz.

+0

+1 - doskonały link, dziękuję bardzo! To może zaoszczędzić niezliczoną liczbę bloków przypisania lewo-prawo w moim kodzie! :-) –

+0

Właściwie to obejrzałem przed wysłaniem, ale nadal wygląda na to, że musisz napisać kod - naprawdę chcę, żeby to automatycznie wygenerowało, nawet jeśli to oznacza, że ​​przeciągam i upuszczam punkty między właściwościami, aby powiedzieć, jak mapa obiektów.To byłoby nieskończenie szybsze niż walenie w kod na płycie. –

+1

@wayne, o ile obiekty będą zgodne z niektórymi konwencjami nazewnictwa, Automapper automatycznie oblicza mapowanie. W przeciwnym razie musisz zrobić trochę więcej konfiguracji z góry, ale to wciąż wygrana. Nie jestem pewien, co jeszcze chcesz wygenerować automatycznie? –

3

Istnieje również interesujący projekt o nazwie Otis. Poniżej znajduje się przykład * Mapowanie .otis.xml wzięte ze strony dokumentacji:

<?xml version="1.0" encoding="utf-8" ?> 
<otis-mapping xmlns="urn:otis-mapping-1.0"> 
<class name="Otis.Tests.UserDTO, Otis.Tests" source="Otis.Tests.Entity.User, Otis.Tests" > 
    <member name="Id" /> 
    <member name="Age" /> 
    <member name="UserName" expression="$UserName.ToUpper()" nullValue="[unknown]" /> 
    <member name="FullName" expression="[$FirstName + ' ' + $LastName]" /> 
    <member name="ProjectCount" expression="$Projects.Count" /> 
    <member name="Title" expression="$Gender" > 
     <map from="Gender.Male" to="Mr." />  <!-- projections --> 
     <map from="Gender.Female" to="Mrs." /> 
    </member> 
    <member name="Birthday" expression="$BirthDate" format="Born on {0:D}"/> 
    <member name="ProjectCount" expression="$Projects.Count" /> 
    <member name="AvgTaskDuration" expression="avg:$Projects/Tasks/Duration" /> 
    <member name="MaxTaskDuration" expression="max:$Projects/Tasks/Duration" />    
</class> 

Aby odczytać pliki mapowania z zespołu:

// configure the new Configuration object using metadata of types in the current assembly 
Configuration cfg = new Configuration();   // instantiate a new Configuration, one per application is needed 
cfg.AddAssembly(Assembly.GetExecutingAssembly()); // initialize it 

Hmm, gdzie widziałem go przed? ;)

+0

+1 również wygląda bardzo interesująco - podoba mi się też pomysł, aby w razie potrzeby udostępnić mapowanie w pliku konfiguracyjnym XML –

+0

Otis nie żyje. Zobacz tutaj http://code.google.com/p/otis-lib/issues/detail?id=15#c1 – MajesticRa

3

użyć ValueInjecter, dzięki czemu można mapować wszystko na cokolwiek np.

  • Przedmiotem < -> obiekt
  • Przedmiotem < -> Formularz/WebForm
  • DataReader -> obiekt

i ma fajne funkcje jak: spłaszczenie i unflattening

+1

Nie chodzi o to, aby pisać kod, ponieważ są to mapowania statyczne. Chodzi o to, że wszystko, co się dzieje, jest słuszne do lewicowego zadania, więc (IMHO) nie zasługuje na żadne odbicie, gimnastykę w czasie wykonywania i tak dalej. Podbij gong "przedwczesnej optymalizacji", ile tylko chcesz, ale jest * świetna * efektywność w robieniu rzeczy w czasie kompilacji w porównaniu z runtime. Widziałem biblioteki takie jak Dozer (dla Javy) tylko żuć procesor dla czegoś tak prostego, jak przydziałach od prawej do lewej. –

+1

@Wayne Hartman Nie miałem żadnych problemów z wydajnością, używa TypeDescriptor, a ja napisałem test, gdzie 1 milion mapowań jest wykonywanych w 2 sekundy, więc nie sądzę, że tutaj problemem jest prędkość/pamięć/procesor – Omu

Powiązane problemy