在ASP.NET MVC3中实现这些功能的更好模式是什么?

时间:2011-12-18 15:52:33

标签: asp.net-mvc-3 design-patterns

我们有一些功能遵循非常相似的模式:

  1. 用户提交电子邮件地址
  2. 用户收到带密码的电子邮件
  3. 用户兑换密码以执行安全操作
  4. 例如,我们的注册/注册功能遵循此模式。用户提交电子邮件地址,接收电子邮件,然后使用密码创建密码&用户帐号。另一个例子是密码重置。用户提交电子邮件地址,接收电子邮件,然后使用密码更改密码和访问用户帐户。

    模式#1

    我们可以有1个控制器来单独管理每个功能。因此,例如,SignUpController处理所有相关操作(发送电子邮件,兑换代码和创建密码)。然后我们可以使用PasswordResetController来处理发送电子邮件,兑换代码和更改密码。

    模式#2

    另一种方法是将操作拆分为控制器。在这种模式中,我们将有一个SendEmailController,它将为这两个功能发送电子邮件,CodeRedemptionController将处理这两个功能的代码更新,以及一个PasswordController,它将处理这两个功能的密码操作。

    哪种方法更好?为什么?我们的主要目标是实现高代码简单性,清晰度/可发现性和干燥性。我可以看到这两种模式的优缺点。

    模式#1优势

    与该功能相关的所有代码都保存在一个位置。使用TempData字典将数据从一个操作传递到另一个操作更容易理解,并且该功能的流程由单个控制器描述。

    模式#1缺点

    依赖注入。每个功能控制器都需要为电子邮件发件人,客户经理(MembershipProvider接口包装器)以及各种存储库注入依赖项。使用构造函数注入时,构造函数会有很多参数。

    模式#2的优点和缺点恰恰相反。我们可以简化控制器的依赖关系,但这些功能将分布在多个控制器上,模糊了整个应用程序试图实现的功能的清晰度。

1 个答案:

答案 0 :(得分: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/

(使用自定义路线,如果愿意,您甚至可以删除/ account / part)

但是,我可能想要创建一个自定义控制器来处理密码的兑换。 (redeemController)通过这种方式,您可以控制对授权/现有用户的大部分accountController的访问权限,而兑换控制器(取决于您的设计)可能对新客户开放匿名。

最后,拥有模型类中的大部分逻辑使它们更加适合测试。