2015-11-14 47 views
1

我有這樣這會被認爲是驗證邏輯的重複嗎?

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int ContactNumber { get; set; } 
    public System.DateTime DateOfBirth { get; set; } 
} 

這些領域的所有樣本類中添加一個客戶數據庫之前是必需的。所以在服務/業務邏輯層我做了這4個屬性的驗證。我驗證FirstName和LastName不是空的,並且ContactNumber大於0,DateOfBirth大於1930(就像一個例子)。在aspx頁面中,我可以將客戶對象傳遞給服務/業務邏輯層以驗證和添加到數據庫,我對ContactNumber和DateOfBirth進行類型檢查。我使用簡單的函數,如IsNumeric和IsDate。

我知道驗證應該在服務層完成,以便如果其他應用程序需要使用此邏輯,將來可以避免重複。

在aspx頁面中進行類型檢查是否很常見,然後將該對象傳遞給執行所有其他驗證的服務層?我知道一種避免這種情況的方法是使用JavaScript。爲了爭論(從未真正發生過),客戶端關閉了他的javascript。我正在考慮的另一個選項是將客戶添加到數據庫的功能將所有參數作爲對象接受。這種方式可以避免在aspx頁面進行類型檢查,只需在服務層完成即可。但是如果有20個屬性作爲方法參數發送呢?

+0

它可能並不清楚你有什麼樣的體系結構,但是在這種體系結構表示層(例如API)中的大多數時間都進行輸入驗證。更進一步,API會調用業務驗證的業務層 – DasBoot

+0

我正在使用3層體系結構。數據,服務和視圖。所有業務驗證都發生在服務層。我唯一在視圖中驗證的是正確的類型被傳遞給業務層。爲了進一步添加,我不驗證視圖中的名字和姓氏。我只驗證聯繫號碼和出生日期是權利類型值。但是在服務層,我對所有4個字段進行了驗證。 – user3587180

+0

你是什麼意思說視圖圖層。如果我理解正確,您的服務層不僅僅是封裝業務邏輯,還會與視圖交互並執行所有業務邏輯。您需要在服務和視圖之間建立一個圖層,負責從請求中獲取數據,進一步傳遞並在其完成後正確運行,或者返回視圖,消息到視圖或其他東西 – DasBoot

回答

1

這一切都取決於你的設計和需求。你提到的要點都是有效的。是的,理想情況下,您需要在服務/業務層進行驗證,以防萬一有多個表示層正在調用它,還因爲服務/業務層負責業務邏輯。

但是,您也是正確的,因爲以下幾個原因,通常會在表示層中完成一些驗證:它是與用戶交互並顯示驗證錯誤的驗證。還有一些驗證技術只能在表示層完成,例如JavaScript,用於使驗證更加靈敏,而不需要每次都訪問服務器。但是,JavaScript驗證僅用於增強用戶體驗,但從不依賴於它作爲真正的驗證,因爲它很容易繞過它。

因此從設計的角度來看,您在服務/業務層和表示層的驗證被認爲是一個好的設計,而不是重複的努力。

但是,實踐有時並不完全按照理論。例如,某些驗證可能會非常耗時且耗時兩次。在這種情況下,可能唯一需要進行此類驗證的地方是服務/業務層。

1

您應該在客戶端和服務器上進行驗證。

如果用戶只是犯了一個錯誤,忘記輸入他們的詳細信息,JavaScript驗證將在客戶端執行,並且會減少往返服務器的次數。這也會提供更好的用戶體驗。

服務器端驗證是至關重要的,也應該執行。如果用戶曾經禁用JavaScript或攻擊者向您的服務器發送惡意表單值,那麼此驗證就會啓動。由於您使用的是WebForms,因此您可以在框架內使用驗證控件,例如:RegularExpressionValidator並具有驗證摘要。

如果你想自己做驗證,那麼這個邏輯最好坐在ValidationService中,如你所描述的那樣,它可以接受Customer類作爲參數,而不是你在問題中陳述的20個屬性。

您可能還想考慮使用其他庫來防止諸如XSS之類的攻擊。

+0

感謝您的快速回復。我有驗證設置的方式是在服務層。我必須在aspx頁面中進行類型檢查,因爲如果我傳入一個非數值的contanctnumber頁面將會彈出。我正在做我的驗證的方式,這是常見的做法? – user3587180

+0

@ user3587180 - 對於此嘗試並使用'RegularExpressionValidator'來確保該控件具有有效的ContactNumber數值。正則表達式就像是:'^ \ d $' –