我的一个项目中有很多用于数据访问的类,但由于从数据读取器中检索数据的代码,这些类变得非常庞大。

我的代码通常如下所示:

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

有些Fill方法很容易达到400多行,所以有没有一种方法可以将它们分开?部分课程可以接受吗?在一个理想的世界里,我会使用ORM,但不幸的是我没有时间学习如何使用它。

有帮助吗?

解决方案

当然,您可以使用部分类来拆分Fill方法的代码。您甚至可以使用模板系统来生成这些部分类文件。

也就是说,ORM是一个更简单的解决方案,如果您的需求很简单,那么花费很长时间才能解决问题。

对于不需要精细控制的基本需求,LINQ to SQL是一种享受,与许多人认为它作为VS 2010 / .NET 4的一部分进行更新相反。

另一个选项是实体框架,也作为VS 2010 / .NET 4的一部分进行更新。它为您提供了更多的控制,但也需要更多的学习。

创建这些400多行长填充方法需要多长时间?你确定你不能用这段时间学习ORM吗?没有程序员应该感到被迫不断编写千篇一律的代码(例如ADO.NET Fill方法),它可以快速消除编程的乐趣!

其他提示

部分类将帮助您分离代码,但文件必须位于同一个项目中。 如果您不想这样做,为什么不从数据访问类继承新类?

您可以将代码提取值从数据读取器移动到辅助类或扩展方法。

E.g:

 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。似乎 IBatis 很容易在您的应用中使用,因为您已经投入大量资金SQL。许多其他ORM也很容易。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top