[英]Best practices for DataBinding in asp.net for maintainability
我想知道在可維護性方面使用asp.net DataBinding的最佳實踐是什么。
當我必須對數據庫進行更改時,我不希望應用程序崩潰。
我應該完全在代碼隱藏中進行數據綁定嗎? 我打算使用ObjectDataSources進行數據綁定。 是否存在比使用數據綁定更容易維護的東西,如果是這樣,它是什么?
是否有考慮因素,在設計數據訪問層和業務層時應考慮到這些因素?
謝謝。
我的理念是數據訪問內容在標記中沒有業務。 對象數據源比SQL數據源更好,但我喜歡將我的標記保留為只會呈現在頁面上的內容。 我也更喜歡你控制的東西是你從后面的代碼總是做的數據綁定。
好問題!
就數據綁定而言,您應將其視為整體數據訪問策略的一個組成部分。 我的策略有三個組件(我在組件2中找到了你的DataBinding):
首先,我總是創建(或主要重用)數據訪問層(DAL)以簡化數據訪問。 這不是因為我有一天可能會將你的數據庫替換為另一個數據庫 - 這種可能性足夠小,以至於它不能保證所有需要的工作(YAGNI)。 這樣做是為了你可以A)從正常的數據庫代碼中刪除所有混亂(例如獲取連接字符串,設置和關閉連接等)和B)使用專用函數簡化常見操作。
其次,您絕對應該實現為您的UI控件封裝DataBinding的ObjectDataSources。 如果你已經建立了一個好的DAL,這變得非常簡單。 例如,這是一個使用我的DAL的ObjectDataSource:
[DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
public List<EnrollListMemberData> GetNameList(int classID, DateTime classDate)
{
using (BSDIQuery qry = new BSDIQuery())
{
return
qry.Command(
"Select a.ClassDate, a.ClientID, b.FirstName, b.LastName, b.ID From ClassEnroll a inner join Folder b on (a.ClientID = b.ClientID) Where (a.ClassID=@ClassID) AND ")
.ParamVal(classID)
.Append("(DateDiff(d, a.ClassDate, @ClassDate) = 0) Order By LastName;")
.ParamVal(classDate)
.ReturnList<EnrollListMemberData>();
}
}
需要注意的一點是:“DataObjectMethodAttribute”屬性將使此方法對設計時環境可見,這樣當您連接Grid(或其他)時,您將在數據源的下拉列表中看到它。 您還需要提供此方法的類的[DataObjectAttribute]屬性(此類是我的業務層的一部分)。 最后,這是一個非常簡單的示例,並且沒有一些常見的結構,例如startRowIndex和maximumRows參數,用於返回分頁結果。
請注意,此處的特定調用來自我的DAL - 即使它具有表面相似性,它也不是LinqToSQL。 我喜歡SQL,我不希望 C#習慣用法反正只有SQL的任意映射 。 請注意,如果我嘗試在直接ADO調用中實現所有這些,那么這個函數將是三倍長,並且有很多代碼與表達我的目標沒有密切關系。
第三,我總是在存儲過程中放置多步數據庫操作,以最大限度地減少通過數據線連接的調用次數。 例如,我在一個產品中提供“檢入”功能,該功能接受檢入請求,根據成員資格表進行檢查,檢索以前的檢入歷史記錄(上個月有多少次訪問?),如果合適,獎勵激勵點,在C#代碼中運行多個查詢和對數據庫的更改將非常復雜且非常昂貴。 為了與DAL理念保持一致,我還將調用封裝在DAL中的存儲過程中,以便代碼的實際調用只是:
int status = dal.CheckIn(userID,ref checkInHistory);
正如你所看到的,使用存儲過程,並在C#類方法封裝它也使代碼更容易閱讀。 我的代碼只是說它做了什么(如上所述),而不是有100多行代碼設置查詢等。
我希望這個對你有用!
僅僅為了完整起見,我想在第一個答案中添加關於我的評論。
我問了以下問題:
如果你從代碼隱藏數據綁定,你仍然需要在標記中定義你的字段。 您如何確保業務對象中的更改不會破壞頁面?
當數據綁定時,如果你轉換了對象,它將在編譯時檢測,如果屬性名稱已更改或不再存在。
例:
<%# ((ObjetType)Container.DataItem).PropertyName %>
此外,這樣做,將避免使用Eval,因為它使用反射,因此報告速度很慢。 (沒有真正檢查自己的性能影響)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.