【发布时间】:2012-06-06 11:48:38
【问题描述】:
我开始在我的 MVC 项目中实现一个服务层来精简一些臃肿的控制器(它也有存储库/工作单元模式)。
我的问题是,如果您的页面有一个复杂的视图模型,其中包含大量子对象等,并且在幕后进行了大量逻辑(让您了解原始开发人员编写的控制器有近 4000 行代码!!)可以让多个服务停止工作吗?还是我应该只拥有一个可以完成所有工作的大型 ReportService?
我的控制器开始看起来像这样?如果我继续下去,我最终可能会调用很多不同的服务来构建视图模型。
这看起来不错,还是开始朝错误的方向发展?
public ViewResult Index(int? reportId)
{
// get the base report object
var reportService = new ReportService();
var report = reportService.GetByReportId(reportId);
var model = Mapper.Map<Report, ReportViewModel>(report);
// get the current active user
var userService = new UserService();
var user = userService.GetCurrentUser();
model.User = Mapper.Map<User, ReportViewModel.UserViewModel>(user);
// get the first unread message
var messageService = new MessageService();
var message = messageService.GetFirstUnread(user.Id);
model.Message = Mapper.Map<Message, ReportViewModel.MessageViewModel>(message);
// get the category navigation
var categoryService = new CategoryService();
var categoryNavigation = categoryService.GetCategoryNavigation(report.Id);
model.CategoryNavigation = Mapper.Map<IEnumerable<Category>, IEnumerable<ReportViewModel.CategoryNavigationViewModel>>(categoryNavigation);
return View(model);
}
【问题讨论】:
-
实际上看起来很干净。控制器方法应该被认为是“补丁面板”,几乎没有或没有业务逻辑。这里就是这种情况。很明显,您在同一页面上显示来自不同来源的不同类型的信息(很像“仪表板”视图),所以我在这里看到的相对复杂性是完全合理的。
-
如果您担心它的复杂性,您可以考虑通过 Ajax 加载每个值并返回部分视图并为每个服务设置一个操作等。这样,如果需要,您可能会拆分您的控制器。