Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 在ASP.NET MVC3中实现这些功能的更好模式是什么?_Asp.net Mvc 3_Design Patterns - Fatal编程技术网

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

Asp.net mvc 3 在ASP.NET MVC3中实现这些功能的更好模式是什么?,asp.net-mvc-3,design-patterns,Asp.net Mvc 3,Design Patterns,我们有几个功能遵循非常相似的模式: 用户提交电子邮件地址 用户收到带有密码的电子邮件 用户赎回密码以执行安全操作 例如,我们的注册/注册功能遵循这种模式。用户提交电子邮件地址,接收电子邮件,然后使用密码创建密码和用户帐户。另一个例子是密码重置。用户提交电子邮件地址,接收电子邮件,然后使用密码更改密码并访问用户帐户 模式#1 我们可以有一个单独管理每个功能的控制器。例如,一个处理所有相关操作(发送电子邮件、兑换代码和创建密码)的注册控制器。然后我们可以有一个PasswordResetControl

我们有几个功能遵循非常相似的模式:

  • 用户提交电子邮件地址
  • 用户收到带有密码的电子邮件
  • 用户赎回密码以执行安全操作
  • 例如,我们的注册/注册功能遵循这种模式。用户提交电子邮件地址,接收电子邮件,然后使用密码创建密码和用户帐户。另一个例子是密码重置。用户提交电子邮件地址,接收电子邮件,然后使用密码更改密码并访问用户帐户

    模式#1

    我们可以有一个单独管理每个功能的控制器。例如,一个处理所有相关操作(发送电子邮件、兑换代码和创建密码)的注册控制器。然后我们可以有一个PasswordResetController,它还可以处理发送电子邮件、兑换代码和更改密码

    模式#2

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

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

    模式#1优势

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

    模式#1缺点

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


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

    我将使用一个帐户控制器来管理所有相关的用户管理功能。该控制器将是用户处理这些类型功能的访问点

    然后,我会将您提到的独立逻辑分离到不同的模型类中,这些模型类将根据需要由该控制器调用。示例:

    /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)

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


    最后,在模型类中使用大多数逻辑使它们更易于测试。

    我将使用一个帐户控制器来管理所有相关的用户管理功能。该控制器将是用户处理这些类型功能的访问点

    然后,我会将您提到的独立逻辑分离到不同的模型类中,这些模型类将根据需要由该控制器调用。示例:

    /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)

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


    最后,在模型类中使用大多数逻辑使它们更易于测试。

    是否有一个选项可以只使用一个AccountController(类似于Visual Studio在创建新应用程序时提供的)?似乎管理关于用户的所有操作并不困难。对于发送电子邮件,我建议使用一些EmailService类和一些电子邮件模板。这太简单了吗?@Shymep,我们已经有了电子邮件模板和电子邮件服务类。事实上,EmailTemplateRepository和EmailService都是这些功能的发送电子邮件组件的依赖项。将所有这些东西放在一个AccountController中会使该控制器极度膨胀。我希望以某种方式将不同的账户相关责任分开。我同意Shymep。如果可能,将用户帐户内容保存在一个控制器中。如果你坚持MVC模式(控制器SCONNY,模型FAT),那么你的控制器就不应该“极度臃肿”,所以即使在每个方法都是精益的情况下,你也不认为在一个控制器中有20个动作方法是臃肿的吗?如果这意味着您必须在控制器构造函数中注入5个以上的依赖项,该怎么办?是否可以选择仅使用一个AccountController(类似于Visual Studio在创建新应用程序时提供的)?似乎管理关于用户的所有操作并不困难。对于发送电子邮件,我建议使用一些EmailService类和一些电子邮件模板。这太简单了吗?@Shymep,我们已经有了电子邮件模板和电子邮件服务类。事实上,EmailTemplateRepository和EmailSe