根据MVC设计模式,如果我们创建一个用户(数据库操作)并且需要向用户发送带有激活码的电子邮件,那么这应该放在模型还是控制器中?在模型创建数据库记录后,这个问题需要考虑。
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;
}
}
MVC和MVC-inspired设计模式是两个层次的结合:
演示层由视图、控制器和(大多数情况下是面向Web的解决方案)模板组成。该层处理用户交互。它识别用户输入,产生响应并管理用户界面的其他方面。根据用户交互,控制器改变模型层的状态。
模型层处理领域业务规则并与不同形式的存储交互。与演示层一样,模型层也不是任何单一对象或类,而是一组具有不同职责的结构。
在这种情况下,对于处理用户管理的服务来说,使用不同的结构将有意义,这些结构既可以发送验证电子邮件、创建帐户,又可以存储这个新创建的用户。
模型层中的服务充当障碍,将表示层与业务逻辑隔离开来。它们处理域对象和存储抽象(数据映射器,仓库,工作单元等)之间的交互。
应该从模型层发送带有新创建用户激活码的电子邮件。
控制器是一个对象,它简化并委托消息给模型对象。
您将拥有一个界面对象(或边界对象)在您的模型中,它代表两个系统之间的链接(您的系统和电子邮件)。类EmailClient。当需要时,您的模型对象将与此对象协作。
UserService
类,该类具有Register
方法,该方法依次调用UserRepository
和EmailService
以执行所需的操作。 - jgauffinUserService
可以被UserController
中的多个操作使用(如果需要)。将业务逻辑放在控制器中也会违反单一职责原则。 - jgauffin