我們必須遵循非常相似的模式的幾個特點:在ASP.NET MVC3中實現這些功能的更好模式是什麼?
- 用戶提交電子郵件地址
- 用戶收到的電子郵件與密碼
- 用戶兌換密碼進行安全行動
對於例如,我們的註冊/註冊功能遵循這種模式。用戶提交電子郵件地址,接收電子郵件,然後使用密碼創建密碼&用戶帳戶。另一個例子是密碼重置。用戶提交電子郵件地址,接收電子郵件,然後使用密碼更改密碼並訪問用戶帳戶。
模式#1
我們可以有1個控制器,管理各獨立功能。例如,一個處理所有相關操作(發送電子郵件,兌換代碼和創建密碼)的SignUpController。然後我們可以擁有一個PasswordResetController,它還可以處理髮送電子郵件,兌換代碼和更改密碼。
模式#2
另一種方法是爲具有跨控制器分裂的操作。在這種模式下,我們需要一個SendEmailController來發送這兩個功能的郵件,一個CodeRedemptionController可以處理這兩個功能的代碼兌換,還有一個PasswordController可以處理這兩個功能的密碼操作。
哪一個更好的方法,爲什麼?我們的主要目標是實現高代碼簡單性,清晰度/可發現性和乾燥性。我可以看到兩種模式的優點和缺點。
模式#1的優點
所有代碼有關的特徵被保持在一個位置。使用TempData字典將數據從一個動作傳遞到另一個動作更容易理解,並且該功能的流程由單個控制器進行描述。
模式#1的缺點
依賴注入。每個功能控制器都需要爲電子郵件發件人,帳戶管理器(MembershipProvider接口包裝器)以及各種存儲庫注入依賴關係。當使用構造函數注入時,構造函數會有很多參數。
模式#2的優點和缺點是相反的。我們可以簡化控制器的依賴關係,但這些功能將分佈在多個控制器中,模糊了整個應用程序嘗試實現哪些功能的清晰度。
是否有一個選項只有一個AccountController(類似於Visual Studio在創建新應用程序時爲您提供的)?似乎管理有關用戶的所有操作並不困難。對於發送電子郵件,我可以建議使用一些電子郵件模板的EmailService類。這太簡單了嗎? – Shymep 2011-12-18 16:17:03
@Shymep,我們已經有電子郵件模板和EmailService類。實際上,EmailTemplateRepository和EmailService都是這些功能中每個功能的發送電子郵件組件的依賴關係。將所有這些東西放在一個AccountController中會使該控制器非常臃腫。我想保持不同的賬戶相關責任。 – danludwig 2011-12-18 16:21:54
我同意Shymep。如果可能的話,保持用戶帳戶在一個控制器中如果你堅持使用MVC模式(控制器很瘦,模型胖),那麼你的控制器不應該「非常臃腫」。 – eth0 2011-12-19 10:33:48