2011-12-18 25 views
2

我們必須遵循非常相似的模式的幾個特點:在ASP.NET MVC3中實現這些功能的更好模式是什麼?

  1. 用戶提交電子郵件地址
  2. 用戶收到的電子郵件與密碼
  3. 用戶兌換密碼進行安全行動

對於例如,我們的註冊/註冊功能遵循這種模式。用戶提交電子郵件地址,接收電子郵件,然後使用密碼創建密碼&用戶帳戶。另一個例子是密碼重置。用戶提交電子郵件地址,接收電子郵件,然後使用密碼更改密碼並訪問用戶帳戶。

模式#1

我們可以有1個控制器,管理各獨立功能。例如,一個處理所有相關操作(發送電子郵件,兌換代碼和創建密碼)的SignUpController。然後我們可以擁有一個PasswordResetController,它還可以處理髮送電子郵件,兌換代碼和更改密碼。

模式#2

另一種方法是爲具有跨控制器分裂的操作。在這種模式下,我們需要一個SendEmailController來發送這兩個功能的郵件,一個CodeRedemptionController可以處理這兩個功能的代碼兌換,還有一個PasswordController可以處理這兩個功能的密碼操作。

哪一個更好的方法,爲什麼?我們的主要目標是實現高代碼簡單性,清晰度/可發現性和乾燥性。我可以看到兩種模式的優點和缺點。

模式#1的優點

所有代碼有關的特徵被保持在一個位置。使用TempData字典將數據從一個動作傳遞到另一個動作更容易理解,並且該功能的流程由單個控制器進行描述。

模式#1的缺點

依賴注入。每個功能控制器都需要爲電子郵件發件人,帳戶管理器(MembershipProvider接口包裝器)以及各種存儲庫注入依賴關係。當使用構造函數注入時,構造函數會有很多參數。

模式#2的優點和缺點是相反的。我們可以簡化控制器的依賴關係,但這些功能將分佈在多個控制器中,模糊了整個應用程序嘗試實現哪些功能的清晰度。

+0

是否有一個選項只有一個AccountController(類似於Visual Studio在創建新應用程序時爲您提供的)?似乎管理有關用戶的所有操作並不困難。對於發送電子郵件,我可以建議使用一些電子郵件模板的EmailService類。這太簡單了嗎? – Shymep 2011-12-18 16:17:03

+0

@Shymep,我們已經有電子郵件模板和EmailService類。實際上,EmailTemplateRepository和EmailService都是這些功能中每個功能的發送電子郵件組件的依賴關係。將所有這些東西放在一個AccountController中會使該控制器非常臃腫。我想保持不同的賬戶相關責任。 – danludwig 2011-12-18 16:21:54

+0

我同意Shymep。如果可能的話,保持用戶帳戶在一個控制器中如果你堅持使用MVC模式(控制器很瘦,模型胖),那麼你的控制器不應該「非常臃腫」。 – eth0 2011-12-19 10:33:48

回答

0

我會使用一個帳戶控制器來管理所有相關的用戶管理功能。這個控制器將是用戶的接入點來處理這些類型的功能。

然後,我會將您提到的單獨邏輯分成不同的模型類,並根據需要由該控制器調用。示例:

/models/EmailManager.cs 
/models/PasswordManager.cs 
/models/SecretCodeGenerator.cs 
/models/AccountManager.cs 

這將允許您擁有統一的url語法。它會讓你只有一種方法讓許多控制器。它會阻止你在控制器中使用很多模型類型的邏輯。

www.mydomain.com/account/signup/ 
www.mydomain.com/account/confirm/ 
www.mydomain.com/account/resetpassword/ 

(定製路線,你甚至可以,如果你想刪除/帳號/部分)

不過,我可能會創建一個自定義控制器來處理救贖的暗號。 (redeemController)通過這種方式,您可以控制只有授權/現有用戶才能訪問大部分accountController,而贖回控制器(取決於您的設計)可能對新客戶開放匿名。

最後,模型類中的大部分邏輯使得它們更友好。

相關問題