簡體   English   中英

asp.net中DataBinding的可維護性最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM