我正在向我們的網站添加功能,該功能使用MSMQ異步執行長時間運行的流程。然而,這樣做意味着我們需要在用戶請求完成時通知用戶。使用命令模式,我創建了一個名爲INotify的接口並將其組合到消息類中,因此消息處理類可以簡單地在消息的INotify對象上調用GiveNotice()。第一個實現EmailNotify比預期的要困難得多,因爲我驚訝地發現MailMessage不是可序列化的,而是讓它發生了。在N層架構中實現數據庫功能對象?
現在我工作的一個新的具體通知,DBNotify,它將調用某種形式的SP和更新的主要事務數據庫狀態。我很沮喪,因爲我想重用我們已經創建的DAL架構,但是INotify是Model項目的一員,它比DAL更爲基礎。
我們的層次看起來是這樣的: 通用>模式> DAL> BAL
以下是關於層的更多細節。請記住,我繼承了這個: 通用負責所有在應用程序中使用很多地方的「實用程序」功能,例如訪問配置設置,解析字符串和與業務無關的功能。
模型是業務對象,有些人稱之爲數據傳輸對象,getter和setters集合。我在這一層添加了一些「智能」,但只有該對象內部的業務規則,例如「一個項目的名稱必須以字母數字字符開頭」。
DAL是數據訪問層,理論上這裏發生的所有事情都是模型對象被移入和移出數據庫。
BAL是業務層;從理論上講,管理對象交互的業務規則是強制執行的(即「一個表單必須至少有兩個項目」)。
所以inotify的接口被定義的抽象,以允許通知的方法獨立地改變(即電子郵件,TXT,微博等)。這是系統的基礎,所以我在模型層創建了它,它獨立於DAL層。但是,我正在創建一個新的具體實現INotify,其通知方法是調用數據庫中的SP。
是否有其他人處理過其目的是與數據庫交互的業務對象,以及您如何將其置於N層架構中?
在你告訴我使用Linq to Sql之前,非常感謝。這不是一個技術問題(我怎麼做),這是一個設計問題(我應該怎麼做)。
我覺得有一個StackExchange網站上這些種類的語言無關性設計問題更集中,所以我要去那裏複製此。
*接口只是名義上的,因爲其實我是想序列化這些對象,我不得不做出它一個抽象類。 – 2011-03-30 19:03:20
我對你的層次感到困惑。模型和BAL負責什麼?我拿BAL來代表商務訪問層,但那個模型看起來不合適。在代碼中,我看到模型通常是最抽象的,位於上面(使用)或是業務層的一部分......另外,如果模型比DAL更基礎,那麼DAL使用類的問題是什麼從模型中調用方法? – 2011-03-31 07:23:29
哦,如果你不知道,你不需要在評論中添加信息,你可以簡單地編輯你的問題... – 2011-03-31 07:24:05