Domanda

Ho molte classi per l'accesso ai dati in uno dei miei progetti, ma queste classi stanno diventando estremamente voluminose a causa del codice che recupera i dati dai lettori di dati.

Il mio codice generalmente appare così:

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

Alcuni dei metodi Fill riempiono facilmente oltre 400 righe, quindi c'è un modo decente per separarli? Le classi parziali sarebbero accettabili? In un mondo ideale, userei un ORM, ma sfortunatamente non posso permettermi il tempo per imparare a usarne uno.

È stato utile?

Soluzione

Certamente potresti usare le classi parziali per dividere il codice per i metodi Fill. Potresti anche guardare usando un sistema di template per generare questi file di classe parziali.

Detto questo, un ORM è una soluzione più semplice e non richiede molto tempo per capire se le tue esigenze sono semplici.

Per esigenze di base in cui non è necessario un controllo accurato LINQ to SQL funziona a meraviglia, e contrariamente a quanto molti pensavano che fosse aggiornato come parte di VS 2010 / .NET 4.

Un'altra opzione è Entity Framework, anch'essa in fase di aggiornamento come parte di VS 2010 / .NET 4. Ti dà un controllo molto maggiore, ma può anche richiedere un po 'più di apprendimento.

Quanto tempo impieghi per creare questi metodi di riempimento lunghi oltre 400 righe? Sei sicuro di non poter usare quel tempo per imparare un ORM? Nessun programmatore dovrebbe sentirsi obbligato a scrivere costantemente un codice cookie-cutter (ad es. Metodi di riempimento ADO.NET), può rapidamente trarre vantaggio dalla programmazione!

Altri suggerimenti

Le classi parziali ti aiuteranno a separare il tuo codice, ma i file dovranno essere nello stesso progetto. Se non lo desideri, perché non ereditare solo nuove classi dalle tue classi di accesso ai dati?

Puoi spostare il codice estraendo valori dal lettore di dati alla classe di supporto o ai metodi di estensione.

per esempio:.

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

Questo ti rimedierà per un po ', anche se ti consiglio di provare un po' di ORM. Sembra che IBatis sarebbe facile da usare nella tua app poiché hai investito molto in raw SQL. E anche molti altri ORM sono facili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top