Вопрос

У меня есть много классов для доступа к данным в одном из моих проектов, но эти классы становятся чрезвычайно громоздкими из-за кода, который извлекает данные из устройств чтения данных.

Мой код обычно выглядит следующим образом:

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

Некоторые методы заливки легко охватывают более 400 строк, так есть ли достойный способ разделить их?Будут ли приемлемы частичные классы?В идеальном мире я бы использовал ORM, но, к сожалению, я не могу позволить себе тратить время на то, чтобы научиться им пользоваться.

Это было полезно?

Решение

Конечно, вы можете использовать частичные классы для разделения кода для методов Fill. Вы даже можете взглянуть на использование системы шаблонов для генерации этих частичных файлов классов.

Тем не менее, ORM - это более простое решение, и на самом деле это не займет много времени, если ваши потребности просты.

Для базовых потребностей, где вам не нужен точный контроль, LINQ to SQL работает как удовольствие, и вопреки тому, что многие думали, что он обновляется как часть VS 2010 / .NET 4.

Другим вариантом является Entity Framework, который также обновляется как часть VS 2010 / .NET 4. Он дает вам гораздо больше контроля, но также может потребовать немного больше обучения.

Сколько времени вам понадобится, чтобы создать эти 400+ строковые методы Fill? Вы уверены, что не могли использовать это время для изучения ORM? Ни один программист не должен чувствовать себя вынужденным постоянно писать код cookie-резака (например, методы ADO.NET Fill), это может быстро убрать удовольствие от программирования!

Другие советы

Частичные классы помогут вам отделить ваш код, но файлы должны быть в одном проекте. Если вы не хотите этого, почему бы просто не наследовать новые классы от ваших классов доступа к данным?

Вы можете переместить код, извлекающий значения из средства чтения данных, во вспомогательный класс или в методы расширения.

Например.:

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

Это поможет вам на некоторое время, хотя я бы рекомендовал попробовать какой-нибудь ORM.Это кажется ИБатис было бы легко использовать в вашем приложении, поскольку вы много вложили в raw SQL.И многие другие ORM тоже просты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top