2015-03-18 22 views
0

我試圖爲用戶類實現數據映射器模式。數據映射器模式:爲用戶模型放置checkLogin方法的位置?

如果我理解正確,業務類User不應調用任何持久性方法,而應將其放入Data Mapper類(UserMapper)中,並且映射器與數據庫接口,理想情況下使用表網關類。

我有一些問題:

  1. 我會在哪裏把checkLogin方法?用戶或UserMapper?我需要通過他的cookie來檢查當前訪問者的登錄狀態。由於用戶不能引用數據庫和會話數據存儲在那裏,我必須使用映射器類嗎?

  2. 我在哪裏放置驗證規則?我想把它們放在User類中,這樣當我實例化它時,如果數據錯誤,我會得到一個異常。不過,我需要在mapper上使用checkLogin()等方法的驗證規則。也許我不應該直接實例化新的User(),相反,我應該從數據映射器創建一個新的用戶,並在其中存儲驗證規則。你怎麼看?

  3. 看來,這樣,我結束了一個非常小的模型類和更大的數據映射類。但由於我的大部分應用程序都是數據庫交互,所以我認爲這並不壞。它是否是一種代碼味道?

謝謝。

回答

1

我認爲你在應用程序中缺少一個組件。除User和UserDataMapper之外,您還需要另一個執行業務邏輯驗證的層。我們稱之爲UserBusiness。

在從UserDataMapper中檢索用戶的詳細信息後,可以在UserBusiness中完成Cookie /會話檢查。 UserDataMapper將返回一個User對象,該對象將具有諸如login,sessionId等所有細節。因此,UserBusiness可以使用這些細節對其進行驗證。

您需要在UserBusiness以及User和UserDataMapper中進行驗證。原因是你正在驗證不同的事情。 UserBusiness中的驗證規則將更具針對性,是限制應用程序規則的用戶名(例如,大於8個字符可以是規則)。如果某個字段不爲空時,用戶可以驗證該字段是否爲空。 UserDataMapper可以驗證用戶名是唯一的還是一些這樣的數據規則。您無需將驗證規則限制爲一個類。

臃腫的數據層並不罕見,但如果不需要臃腫也不是一個好主意。數據層只能處理與數據庫相關的驗證,檢索和處理。做更多的事情在大多數情況下都是一種氣味。