ASP.NET MVC - 服务层,在每个控制器动作单个或多个服务?(ASP.NET MVC -

2019-07-29 18:07发布

我开始实现服务层到我的MVC项目瘦下去一些臃肿的控制器(也有资料库/的UnitOfWork模式)。

我的问题是,如果你有一个页面有很多子对象等的复杂视图模型,以及相当多的逻辑去幕后(给你一个想法控制器原开发商写了近4000行代码! !)是它可以拥有多个服务都会响起做自己的事情吗? 或者我应该只是有一个很大的ReportService的这一切呢?

我的控制器开始看起来像吗? 如果我继续我可能最终有相当多的不同的服务被称为建立视图模型。

这看起来OK,或者它开始在错误的方向走?

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);
    }

Answer 1:

它的罚款在你的控制器有多个小型服务。 然而,有一件事是错在这里:

您的服务应该是可以通过整个控制器,并通过构造函数来实现松耦合注入。

因此,像这样:

private readonly IReportService _reportService;
private readonly IUserService _userService;

public SomeConstructor(IReportService reportService, IUserService userService, etc.) 
{
    _reportService = reportService;
    _userService = userService;
    // etc
}


Answer 2:

最好的解决方案将取决于您的特定使用案例,但 - 这看起来像一个很好的方法,另一种方法将要使用儿童的行动分割一些的这件事。

如果,例如,在ViewModel财产CategoryNavigation正在使用的视图来创建一种导航“窗口小部件”的,可能在几个不同的意见是有用的,你可能会更好的分裂这一关成ChildAction如

[ChildActionOnly]
public ActionResult CategoryNavigationWidget(int reportId)
{
    // get the category navigation
    var categoryService = new CategoryService();
    var categoryNavigation = categoryService.GetCategoryNavigation(report.Id);

    return PartialView(categoryNavigation);
}

然后查看任何可能使通过往那个ChildAction:

   @{ Html.RenderAction("CategoryNavigationWidget", "Report", 
           new { reportId = Model.ReportId }); }

这是否是一个好主意,将可能取决于是否将“小部件”是可重复使用。



文章来源: ASP.NET MVC - Service layer, single or many services in each controller action?