2009-10-26 41 views
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; 
} 

一些填充方法轻松命中400+线,所以有这些分离出一个体面的方式?部分班级可以接受吗?在理想的世界中,我会使用ORM,但不幸的是我无法承担学习如何使用ORM的时间。

回答

4

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

也就是说,ORM是一个更简单的解决方案,如果您的需求很简单,并不需要很长的时间。

基本需求,你并不需要精确控制的LINQ to SQL的作品一种享受,而相反的是,许多人以为它变得更新VS 2010/.NET 4的一部分。

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

需要多长时间才能创建这些400多行长的填充方法?你确定你不能用这段时间学习一个ORM吗?没有程序员应该不得不不断地编写cookie-cut代码(例如ADO.NET Fill方法),它可以快速从编程中获得快乐!

+0

同意 - 当然,有些ORM需要很长时间才能学习,但如果在编写400行方法的时间内无法学习LINQ to SQL,我只能说...呃,你必须快速写出400行的方法! ** grin ** – itowlson 2009-10-26 11:03:54

+0

我不同意LinqToSql或任何其他ORM的快速和/或易于学习。大多数学习LinqToSql的人都在解决DataContext生命周期管理问题,更新之前的分离以及许多其他常见的“ORM”问题。 – 2009-10-26 11:42:15

+0

我有一个我写的代码给我的应用程序,所以编写cookie切割代码并不是什么大问题。 我不介意切换到实体框架,但我们很可能不会升级到VS2010很长一段时间。 – 2009-10-26 12:28:29

0

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

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