2009-02-17 50 views
7

我想知道在可維護性方面使用asp.net DataBinding的最佳做法是什麼。在asp.net中進行DataBinding維護的最佳做法

當我不得不對數據庫進行更改時,我不希望應用程序崩潰。

我應該在代碼隱藏中完全綁定數據嗎?我正在計劃使用ObjectDataSources進行數據綁定。有沒有比使用數據綁定更容易維護的東西,如果是,它是什麼?

有沒有考慮因素,我在設計數據訪問層和業務層時應該考慮到這些因素?

謝謝。

回答

4

我的理念是數據訪問的東西在標記中沒有任何業務。對象數據源比SQL數據源更好,但我喜歡將我的標記保留爲只會呈現在頁面上的東西。我也更喜歡你掌握的東西是什麼東西,你總是從背後的代碼中獲得數據。

+0

謝謝,但在標記中,如果您從代碼隱藏數據綁定,您仍然必須在標記中定義您的字段。您如何確保業務對象中的更改不會破壞頁面? – Martin 2009-02-17 20:34:16

+0

你可以做的事情不多,對象數據源也不能真正解決這個問題。在發佈之前只需測試一下這些變化 – 2009-02-17 20:36:17

2

好問題!

就數據綁定而言,您應該將它看作只有整體數據訪問策略的一個組件。我的策略有三個組成部分(我到了組件2中的DataBinding):

首先,我總是創建(或重新使用)數據訪問層(DAL)來簡化數據訪問。這是而不是,因爲有一天我可能會將數據庫換成另一個數據庫 - 這種機會很渺茫,不能保證所有需要的工作(YAGNI)。您可以這樣做,以便您可以A)從常規數據庫代碼中刪除所有混亂(例如,獲取連接字符串,設置和關閉連接等),並且B)使用專用函數簡化常見操作。

其次,你絕對是應該實現ObjectDataSources封裝你的UI控件的DataBinding。如果你已經構建了一個好的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 ([email protected]) 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#成語just have an arbitrary mapping back to SQL anyway。請注意,如果我試圖在直接的ADO調用中實現所有這些功能,該功能將是三倍的時間,並且有大量代碼與表達我的目標無關。

第三,我總是將多步驟數據庫操作置於存儲過程中,以最大限度地減少通過數據線連接的調用數量。例如,我在一個產品中提供了「簽入」功能,該功能會接受簽入請求,根據成員資格表對其進行檢查,檢索先前簽入的歷史記錄(上個月有多少次訪問?),在適當的情況下頒發獎勵點,等等。在C#代碼中運行多個查詢和更改數據庫將非常複雜且相當昂貴。爲了與我們的DAL哲學保持一致,我還將調用存儲過程調用到DAL中,以便實際的代碼調用只是:

int status = dal.CheckIn(userID,ref checkInHistory);如您所見,使用存儲過程並將其封裝在C#類方法中也使得代碼遠至更易於閱讀。我的代碼只是說它做了什麼(如上),而不是有100多行代碼設置查詢等。

我希望這有助於!

0

爲了完整起見,我想在第一個答案中添加關於我的評論的內容。

我提出以下問題:

如果從代碼隱藏數據綁定,你 仍會有該標記來定義的字段 。您如何確定 確定您的商家 對象的更改不會破壞頁面?

當數據綁定時,如果您施放了對象,它將在編譯時檢測到,如果屬性名稱已更改或者不再存在。

例:

<%# ((ObjetType)Container.DataItem).PropertyName %> 

而且,這樣做,將避免使用eval,該報道是緩慢的,因爲它使用反射。 (沒有真正檢查自己的性能影響)