MVC设计模式的模型逻辑

5
根据MVC设计模式,如果我们创建一个用户(数据库操作)并且需要向用户发送带有激活码的电子邮件,那么这应该放在模型还是控制器中?在模型创建数据库记录后,这个问题需要考虑。
3个回答

8
MVC模式用于在业务逻辑(模型)和GUI(视图)之间创建抽象层。控制器只是这两个模块之间的适配器(谷歌适配器模式)。因此,控制器应该只包含用于从控制器中获取所需信息并调整其以适应视图的代码。任何其他逻辑都应该在模型中。只有当您理解模型不是单个类而是所有业务逻辑时,这才有意义。例如(实现特定,但我希望您能理解)。
public class UserController : Controller
{
    // notice that it's a view model and not a model
    public ActionResult Register(RegisterViewModel model)
    {
        UserService service;
        User user = service.Register(model.UserName);
        return View("Created");
    }
}

// this class is located in the "model"
public class UserService
{
   public User Register(string userName)
   {
       // another class in the "model"
       var repository = new UserRepository();
       var user = repository.Create(userName);

       // just another "model" class
       var emailService = new EmailService();
       emailService.SendActivationEmail(user.Email);

       return user;
   }
}

控制器应该发送电子邮件,这是错误的。业务逻辑不应存在于控制器中。 - jgauffin
4
如果你认为模型不应该发送电子邮件,那么你并没有理解MVC。 - jgauffin
2
模型不是单一类。模型可以包含每个控制器操作的多个类。但通常您会创建一个UserService类,该类具有Register方法,该方法依次调用UserRepositoryEmailService以执行所需的操作。 - jgauffin
UserService 可以被 UserController 中的多个操作使用(如果需要)。将业务逻辑放在控制器中也会违反单一职责原则。 - jgauffin
1
@IonutFlaviusPogacian,既然您是PHP开发人员,请阅读这篇文章。它可能会澄清您的一些困惑。 - tereško
显示剩余8条评论

3

MVC和MVC-inspired设计模式是两个层次的结合:

  • 演示层
  • 模型层

演示层由视图、控制器和(大多数情况下是面向Web的解决方案)模板组成。该层处理用户交互。它识别用户输入,产生响应并管理用户界面的其他方面。根据用户交互,控制器改变模型层的状态。

模型层处理领域业务规则并与不同形式的存储交互。与演示层一样,模型层也不是任何单一对象或类,而是一组具有不同职责的结构。

在这种情况下,对于处理用户管理的服务来说,使用不同的结构将有意义,这些结构既可以发送验证电子邮件、创建帐户,又可以存储这个新创建的用户。

模型层中的服务充当障碍,将表示层与业务逻辑隔离开来。它们处理域对象和存储抽象(数据映射器仓库工作单元等)之间的交互。

简而言之

应该从模型层发送带有新创建用户激活码的电子邮件。


0

控制器是一个对象,它简化并委托消息给模型对象。

您将拥有一个界面对象(或边界对象)在您的模型中,它代表两个系统之间的链接(您的系统和电子邮件)。类EmailClient。当需要时,您的模型对象将与此对象协作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接