部分类和数据访问代码

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多行,是否有一种合理的方法来分离它们?部分类(partial classes)是否可行?在理想的情况下,我将使用ORM,但不幸的是,我没有时间学习如何使用它。

3个回答

4
当然,您可以使用部分类来分离Fill方法的代码。您甚至可以考虑使用模板系统来生成这些部分类文件。
话虽如此,ORM是一个更简单的解决方案,如果您的需求很简单,它不需要太长时间才能解决。
对于不需要精细控制的基本需要,LINQ to SQL效果很好,与许多人想的相反,它正在作为VS 2010 / .NET 4的一部分得到更新。
另一个选择是Entity Framework,也作为VS 2010 / .NET 4的一部分得到更新。它为您提供了更多的控制,但也可能需要更多的学习。
您需要多长时间来创建这些400多行的Fill方法?您确定您不能利用这个时间来学习ORM吗?没有程序员应该感到被迫不断地编写模板化的代码(例如ADO.NET Fill方法),它会很快削弱编程的乐趣!

同意 - 当然,有些ORM确实需要很长时间来学习,但如果你不能在编写400行代码的时间内学会LINQ to SQL,我只能说...嗯,你一定非常擅长编写400行代码! 微笑 - itowlson
我不认为LinqToSql或任何其他ORM是快速和/或易学的。大多数学习LinqToSql的人都会遇到DataContext生命周期管理、更新前分离以及许多其他正常的“ORM”问题。 - Michael Maddox
我有一个应用程序,可以为我生成代码,因此编写模板代码并不是什么问题。我不介意转向实体框架,但我们很可能不会在相当长的一段时间内升级到VS2010。 - Dan Scott

0

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

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也很容易上手。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接