我的一个项目中有很多用于数据访问的类,但由于从数据读取器中检索数据的代码,这些类变得非常庞大。
我的代码通常如下所示:
// 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,但不幸的是我没有时间学习如何使用它。
答案 0 :(得分:4)
当然,您可以使用部分类来拆分Fill方法的代码。您甚至可以使用模板系统来生成这些部分类文件。
也就是说,ORM是一个更简单的解决方案,如果您的需求很简单,那么花费很长时间才能解决问题。
对于不需要精细控制的基本需求,LINQ to SQL是一种享受,与许多人认为它作为VS 2010 / .NET 4的一部分进行更新相反。
另一个选项是实体框架,也作为VS 2010 / .NET 4的一部分进行更新。它为您提供了更多的控制,但也需要更多的学习。
创建这些400多行长填充方法需要多长时间?你确定你不能用这段时间学习ORM吗?没有程序员应该感到被迫不断编写千篇一律的代码(例如ADO.NET Fill方法),它可以快速消除编程的乐趣!
答案 1 :(得分:0)
部分类将帮助您分离代码,但文件必须位于同一个项目中。 如果您不想这样做,为什么不从数据访问类继承新类?
答案 2 :(得分: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也很容易。