1

考慮使用EF4 POCO實體和存儲庫模式將信息存儲在SQL Server數據庫中的ASP.NET MVC 2 Web應用程序項目。到目前爲止,有3個項目,如果您計算數據庫,則有4個項目:鑑於此應用程序設計,放置驗證邏輯的最佳位置在哪裏?

1.)Domain.dll沒有依賴關係,它暴露了POCO和存儲庫接口。

2.)Storage.dll依賴於Domain,實現了存儲庫接口(使用EF 4)。

3.)Mvc.dll取決於#1和#2,提供UI層。

4.)SQL Server數據庫+連接,dll不可知(無依賴關係)。

比方說,我添加其他Web應用程序來承載WCF數據服務,它提供了使用Domain.dll和Storage.dll數據庫的OData源:

5)Provider.dll,依賴於域&存儲,提供OData服務層。

域驗證邏輯屬於哪個解決方案?如果域POCO類用驗證屬性裝飾,WCF數據服務是否需要其他任何東西來保護數據?將驗證邏輯放入存儲過程是否曾經是個好主意?爲什麼?

+0

把驗證邏輯放在SP中是一個壞主意,因爲你不能輕易改變dbs(實際上它幾乎不會發生),但意味着如果沒有實際的db(這實際上是一件壞事),你不能單元測試,而且它的笨重一直在層面上獲取錯誤消息。此外,你正在傷害可伸縮性。話雖如此,唯一的鑰匙等*應該*存在你的數據庫作爲一個back stop的理智。 – Nik 2010-10-12 17:31:55

+0

對。我實際上是在詢問有關sp的具體驗證。我的一些實體表示分層節點,因此存在循環層次關係的可能性。這可能是我應該通過檢查db客戶端和db本身來加強的地方,儘管通過觸發器而不是sp來實現。 – danludwig 2010-10-13 13:13:36

回答

1

我會說將DataAttributes放在域上,並在MVC中使用MVC驗證部分,並使用Ent Lib在WCF服務中進行驗證。或者,你可以在MVC和WCF中使用Ent Live驗證,但那不是這個問題。我不知道這需要歸結爲DDD語義。 MVC在模型上具有DataAttributes時進行驗證,因此請按照WCF中的相同方法進行驗證。

+0

謝謝,我昨天在問這個問題後纔剛剛發現了entlib驗證塊。 MVC項目已經在使用Unity 2。0,所以entlib看起來很有前途。 – danludwig 2010-10-13 13:10:44

+0

我會爲我自己的博客插上這個......如果你想將entlib作爲提供者放入你的MVC解決方案中,請查看這篇文章:http://www.bitsinmyhead.com/2010/09/asp-net- mvc-2-0-and-its-validation%E2%80%A6-using-a-custom-provider/ – CrazyDart 2010-10-14 04:53:01

+0

我還發現了在MVC中使用entlib驗證的一點小技巧:http://codebetter.com/blogs/ david.hayden /存檔/ 2009/02/03/AN-AHA-時刻-ON-MVC驗證,擴展功能於defaultmodelbinder再見到idataerrorinfo.aspx – danludwig 2010-10-15 13:43:30

1

我將此標記爲主觀性和論證性的,因爲即使DDD社區也無法對此做出決定。

如果Customer.LastName的新驗證要求進來,您需要更改多少個圖層? UI層可以通知用戶域,wcf,web,數據庫層是否拒絕了他們的命令? LastName限制如何限制姓氏不能超過業務域的50個字符部分?

你可以看到這是一個真正的討論,而不是一個可回答的問題。


此外,如果您使用OData作爲您的服務的數據庫飼料,您不使用DDD。您正在使用Persistant-As-Model或DDD-Lite。這實際上是有害的,並導致像這樣的問題試圖解決使用兩個不兼容模式在一起的問題。

相關問題