2011-10-10 15 views
5

Poszukuję dyskusji z tym wpisem.ExpandoObject do obiektu statycznego iz powrotem. Obejmuję dwie domeny:

Zajmuję się włączeniem dynamicznych funkcji C# 4.0 do starszego systemu. Moim wyraźnym przykładem jest użycie Massive Rob Connery w warstwie danych. Ale moje pytania będą miały zastosowanie wszędzie tam, gdzie obiekt dynamiczny musi wchodzić w interakcje z istniejącym, silnie typowanym obiektem biznesowym, tak, że istnieje mapowanie między właściwościami.

mogę zautomatyzować konwersję do i od statycznych (betonowe) obiektów i przedmiotów EXPANDO z następujących dwóch metod (uproszczony):

public static object ToConcrete<T>(System.Dynamic.ExpandoObject dynObject) 
    { 
     object instance = Activator.CreateInstance<T>(); 
     var dict = dynObject as IDictionary<string, object>; 
     PropertyInfo[] targetProperties = instance.GetType().GetProperties(); 

     foreach (PropertyInfo property in targetProperties) 
     { 
      object propVal; 
      if (dict.TryGetValue(property.Name, out propVal)) 
      { 
       property.SetValue(instance, propVal, null); 
      } 
     } 

     return instance; 
    } 

    public static System.Dynamic.ExpandoObject ToExpando(object staticObject) 
    { 
     System.Dynamic.ExpandoObject expando = new ExpandoObject(); 
     var dict = expando as IDictionary<string, object>; 
     PropertyInfo[] properties = staticObject.GetType().GetProperties(); 

     foreach (PropertyInfo property in properties) 
     { 
      dict[property.Name] = property.GetValue(staticObject, null); 
     } 

     return expando; 
    } 

Ale teraz mam kilka pytań.

Czy moja próba rozpięcia dynamicznego i niedynamicznego w starym systemie jest błędnym przekonaniem z mojej strony? Czy to znaczy, że pracuję wbrew intencji dynamicznej? Czy podejmuję się problemów?

Czy moje wykorzystanie dynamiki powinno być ograniczone do komponentów, które ją całkowicie zawierają, bez odwzorowania między obiektami dynamicznymi a obiektami statycznymi? Czy to nie jest dobra praktyka, aby próbować mieszać te dwie domeny językowe? Czy tworzę złą architekturę? Anty-wzór?

W przypadku komponentu takiego jak Massive, jeśli mówimy, że niewłaściwym zwyczajem jest mapowanie między ExpandoObject i silnie wpisanymi obiektami, to nie ma możliwości, aby podłączyć go do mojego dotychczasowego systemu, ponieważ musi on wyprowadzać obiekty biznesowe do stary kod i nie ma praktycznego sposobu, w jaki mogę, lub powinienem, przekształcić obiekty dużej, starszej bazy kodu w obiekty dynamiczne. Może dynamiczne nie mogą być realistycznie dodane do starej bazy kodu .Net. Może to musi być włączone od początku lub wcale.

+0

Jaką motywację masz do używania 'ExpandoObject's w ogóle? – svick

Odpowiedz

2

Po prostu chcesz mapować statycznie wpisane obiekty na obiekty dynamiczne, aby mogły być używane w Massive. Myślę, że to jest w porządku, to tak jak odwzorowywanie obiektów biznesowych na LINQ na obiekty SQL, abyś mógł pracować z tą ORM. Minusem jest jednak to, że skończy się mapowanie wszystkich zi do bazy danych. To może stać się bólem. Dla LINQ-a jest to dla mnie bolesne.

Zastanów się, jak to będzie zmieniać kod, a Ty mierzysz skuteczność tego podejścia. Dla mnie, kiedy muszę dodać obiekt do obiektu biznesowego, muszę:

  1. dodać właściwość do obiektu
  2. Napisz migracji DB zmienić stół
  3. zregenerować LINQ do plik
  4. SQL mapie nową właściwość

jest to ból. Twoje podejście z masywnego, jeśli twoi pomocnicy mapowania działa poprawnie, oznacza to trzeba zrobić:

  1. dodać właściwość do obiektu
  2. Napisz migracji DB zmienić stół

to nie zły. W jaki sposób obsługiwane są wykresy obiektów? Jeśli masz tabelę Person i tabelę adresów z relacją 1-M, co oznacza, że ​​dana osoba może mieć wiele adresów. Jak możesz zapytać i uzyskać listę osób z ich adresami? Jak będzie wyglądać twoje mapowanie?

Innym podejściem byłoby sprawdzić, czy NHibernate lub Entity Framework będą działać w twojej sytuacji. Są one zaprojektowane do pracy z obiektami wpisanymi statycznie. Wygląda na to, że Massive został zaprojektowany z myślą o szybkim i łatwym dostępie do danych. Inną szybką i łatwą biblioteką, która jest zbudowana dla obiektów statycznie wpisanych, jest Dapper. Jest łatwy w użyciu. Sprawdź to na Nuget. Właściwie, z tego, co rozumiem w twojej sytuacji, zdecydowanie uważam Dappera.

Powiązane problemy