2011-10-10 12 views
5

Estoy buscando alguna discusión con esta publicación.ExpandoObject al objeto estático y viceversa. Abarcando los dos dominios

Estoy buscando incorporar funciones dinámicas C# 4.0 en un sistema heredado. Mi ejemplo explícito es usar Massive de Rob Connery en una capa de datos. Pero mis preguntas se aplicarían en cualquier lugar en el que un objeto dinámico deba interactuar con un objeto comercial existente, fuertemente tipado, de modo que haya una asignación entre las propiedades.

que puede automatizar la conversión desde y hacia los objetos estáticos (hormigón) y objetos expando con los dos métodos siguientes (simplificado):

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; 
    } 

Pero ahora tengo una serie de preguntas.

¿Mi intento de abarcar dinámicas y no dinámicas en un sistema heredado representa una idea errónea de mi parte? Es decir, ¿estoy trabajando en contra de la intención dinámica? ¿Me estoy preparando para problemas?

¿Debería mi uso de la dinámica estar limitado a componentes que lo contengan completamente sin mapeo entre objetos dinámicos y objetos estáticos? Es decir, ¿es una mala práctica intentar mezclar los dos dominios del lenguaje? ¿Estoy creando una mala arquitectura? Un antipatrón?

En el caso de un componente como Massive, si decimos que es una mala práctica mapear entre objetos expandidos y fuertemente tipados, entonces no hay forma de que pueda conectarlo a mi sistema heredado, ya que debe hacer aparecer objetos comerciales en el código heredado y no hay una manera práctica en que pueda, o deba, refactorizar los objetos de una base de código heredada grande en objetos dinámicos. Quizás la dinámica no se puede agregar de manera realista a una base de código .Net heredada. Tal vez tiene que ser incorporado desde el principio, o no en absoluto.

+0

¿Qué motivación tiene para usar 'ExpandoObject's en absoluto? – svick

Respuesta

2

Así que solo desea asignar objetos tipicamente estáticos a objetos dinámicos para que puedan ser utilizados en Massive. Creo que esto está bien, es como asignar objetos comerciales a objetos LINQ to SQL para que pueda trabajar con ese ORM. Sin embargo, un inconveniente es que terminará mapeando todo dentro y fuera de su base de datos. Esto puede convertirse en un dolor. Es un dolor para mí con LINQ to SQL.

Piensa en cómo será cambiar el código, y puedes medir qué tan efectivo es este enfoque. Para mí, cuando tengo que añadir una propiedad de un objeto de negocio, tengo que:

  1. añadir la propiedad al objeto
  2. Escribe una migración DB para modificar la tabla
  3. Regenerar el LINQ to
  4. archivo
  5. SQL mapa la nueva propiedad

Este es un dolor. Su enfoque con Massive, si sus ayudantes de asignación funcionan correctamente, significa que tiene que hacer:

  1. añadir la propiedad al objeto
  2. Escribe una migración DB para modificar la tabla

Eso no es malo. Además, ¿cómo se manejarán los gráficos de objetos? Si tiene una tabla Person y una tabla Address con una relación 1-M, lo que significa que una persona puede tener varias direcciones. ¿Cómo puede consultar y obtener una lista de personas con sus direcciones? ¿Cómo se verá tu mapeo?

Otro enfoque sería ver si NHibernate o Entity Framework funcionarían en su situación. Están diseñados para trabajar con objetos de tipo estático. Massive parece diseñado para un acceso de datos rápido y fácil. Otra biblioteca rápida y fácil que es compilación para objetos de tipo estático es Dapper. Es fácil de usar Compruébalo en Nuget. En realidad, por lo que entiendo de tu situación, consideraría a Dapper.

Cuestiones relacionadas