3

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

我的代码通常如下所示:

// 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,但不幸的是,我没有时间学习如何使用它。

4

3 回答 3

4

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

也就是说,ORM 是一种更简单的解决方案,如果您的需求很简单,则不需要那么长时间来解决。

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

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

创建这些 400+ 行长的填充方法需要多长时间?你确定你不能利用这段时间来学习 ORM 吗?任何程序员都不应该被迫不断地编写千篇一律的代码(例如 ADO.NET Fill 方法),它可以很快地从编程中带走乐趣!

于 2009-10-26T10:52:29.520 回答
0

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

例如:

 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 也很简单。

于 2009-10-26T11:07:24.480 回答
0

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

于 2009-10-26T10:55:16.893 回答