Pregunta

Tengo un montón de clases para acceso a datos en uno de mis proyectos, pero estas clases se están volviendo extremadamente voluminosas debido al código que recupera los datos de los lectores de datos.

Mi código generalmente se ve así:

// Execute the data reader
using (DbDataReader reader = command.ExecuteReader())
{
  while (reader.Read())
  {
     obj = this.FillDataReader(reader);
     objlist.Add(obj);
  }
}

internal SomeObject FillDataReader(IDataReader dr)
{
   SomeObject obj = new SomeObject ();


   if (!dr.IsDBNull(dr.GetOrdinal("objectID")))
   {
     obj.ID = dr.GetInt32(dr.GetOrdinal("objectID"));
   }

   return obj;
}

Algunos de los métodos de Relleno llegan fácilmente a más de 400 líneas, así que, ¿hay alguna forma decente de separarlos? ¿Serían aceptables las clases parciales? En un mundo ideal, estaría usando un ORM, pero desafortunadamente no puedo permitirme el tiempo para aprender a usar uno.

¿Fue útil?

Solución

Ciertamente, podría usar clases parciales para separar el código de los métodos de Relleno. Incluso podría considerar el uso de un sistema de plantillas para generar estos archivos de clase parciales.

Dicho esto, un ORM es una solución más simple y realmente no toma tanto tiempo si sus necesidades son simples.

Para las necesidades básicas en las que no necesita un control preciso, LINQ to SQL funciona bien y, contrariamente a lo que muchos piensan, se está actualizando como parte de VS 2010 / .NET 4.

Otra opción es Entity Framework, que también se actualiza como parte de VS 2010 / .NET 4. Le brinda mucho más control, pero también puede requerir un poco más de aprendizaje.

¿Cuánto tiempo te lleva crear estos métodos de relleno de más de 400 líneas? ¿Estás seguro de que no pudiste usar ese tiempo para aprender un ORM? Ningún programador debe sentirse obligado a escribir constantemente un código cortador de cookies (por ejemplo, los métodos de relleno de ADO.NET), ¡puede sacar rápidamente la alegría de la programación!

Otros consejos

Las clases parciales te ayudarán a separar tu código, pero los archivos deberán estar en el mismo proyecto. Si no quieres esto, ¿por qué no heredar nuevas clases de tus clases de acceso a datos?

Puede mover el código extrayendo valores del lector de datos a la clase auxiliar o a los métodos de extensión.

Por ejemplo:

 public int GetIntOrDefault(this DataReader dr, string fieldName, int defaultValue){
     var value = dr.GetOrdinal(fieldName);
     return (!dr.IsDBNull(value)) ? dr.GetInt32(value) : defaultValue;
 }

 internal SomeObject FillDataReader(IDataReader dr)
 {
    SomeObject obj = new SomeObject ();
    obj.ID = dr.GetInt32OrDefault("objectID", 0); // 1 line instead of 4
    ...
    return obj;
 }

Esto te remediará por un tiempo, aunque te recomiendo que pruebes un poco de ORM. Parece que IBatis sería fácil de usar en tu aplicación, ya que has invertido mucho en materias primas SQL Y muchos otros ORM también son fáciles.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top