2009-10-26 69 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也很容易。