2010-12-03 100 views
0

我有一個像這樣的MVC解決方案設置,有三個'項目'。ASP.NET MVC - 身份驗證層在哪裏?

網(MVC項目,視圖,控制器的ViewModels)

模型(域對象)

持久性(NHibernate的映射,SessionFactory的)

我需要開始建立資料庫,並且將從認證模型開始。基本上遵循默認的MVC模板,有一個IMembershipService和一個IFormsAuthenticationService和相關的類(使用自定義代碼,不內置在身份驗證提供程序中)。

我的問題是......這應該去哪裏?我的存儲庫需要訪問我的域對象和我的持久層。不過,我一直認爲任何一種「耦合」都意味着它是一種糟糕的設計。因此,我不願意爲引用Models/Persistence的Repositories/Services創建第四個項目......但我無法真正找到任何其他方式來按照邏輯執行它。

回答

3

這是非常主觀的。

做什麼對你和你的團隊有意義。

我把它們和我的其他庫放在一起。我的意思是用戶對任何應用程序都很重要?用戶是否擁有任何東西?如果是的話,那麼他不是一個根?

+0

我害怕做任何事情,需要我參考解決方案的另一部分。看起來無處不在,我所看到的只是人們在談論項目任何部分的「任何」耦合是多麼可怕。在這一點上,我和我的團隊沒有任何意義 - 因爲如果不在某個級別耦合到域和映射模型,實際上與數據庫進行通信似乎是不可能的。我是否允許應用程序的Repository部分查看SessionFactory?我是否必須避免看到其他東西? – Ciel 2010-12-03 20:50:25

+0

我不會過分關注程序集引用。事實是他們*是耦合的。一個需要另一個來運作。總是需要遵守一些紀律,以避免濫用技術上可用的內容和範圍。 – 2010-12-03 20:59:40

2

存儲庫是域的一部分。

在減少裝配參考和最小化項目數量之間總會存在張力。也就是說,通過將功能分解爲更細粒度的程序集,可以使每個程序集引用的依賴性更少;然而,將項目過度劃分爲許多程序集需要更多的努力來管理。

值得一提的另一點是身份驗證有一些副作用。一個是圍繞用戶,角色,權限等來管理模型 - 這是一個領域問題。另一個是與執行環境(無論是ASP.Net應用程序,WinForms等)接口 - 這是一個基礎設施問題。因此,我最終在我的MVC項目或WinForms項目中執行了一項小型服務,該項目執行諸如設置表單身份驗證cookie或設置當前線程主體等功能。

1

Separated interface pattern表示您的模型和存儲庫接口應該位於一個獨立的程序集,除了GUI和實際的存儲庫實現。這是爲了能夠稍後切換實施並能夠簡化測試。

將界面與存儲庫接口以及mvc項目或存儲庫項目中的實際實現放在一起時,我不會有任何問題。如果您使用IoC容器,稍後移動內容會非常容易。