3

我想我开始对 MVC 中控制器的工作感到困惑。

我有一个公开五个功能的服务:

  • 列出队列中的包
  • 获取包裹
  • 删除包
  • 接受包裹
  • 拒绝包裹

我的 ASP.NET MVC 控制器依赖于该服务,并且通常可以对 Action 执行服务调用。到目前为止我很高兴。

然后第二部分是构建 ViewModel 结果。如果我在控制器内部执行此操作,控制器现在有一个爆炸性的依赖关系列表——添加的每个操作都会增加依赖关系以构建视图模型,这些都由控制器继承。我不太喜欢这个。我正在构建这个控制器,它依赖于 N 个不同的视图模型构建器,但每个请求只使用其中一个。

所以我想把所有这些都拉出来,并应用特定于每个视图模型的动作过滤器。我还没有这样做,但似乎还可以。

这对我提出的问题是:控制者的责任是什么?如果我最终将视图模型构建拉入过滤器,我的控制器所做的只是让路由执行服务调用(并提供过滤器插件)。如果我让我的控制器负责构建每个视图模型,它就会变得一团糟。

似乎我几乎想为每个请求实例化一个动作,而不是一个控制器,而我只是滥用过滤器来实现这一点?

4

2 回答 2

4

你有专门的 ViewModel 和 Poco 模型吗?如果是这种情况,您可以处理来自 ViewModel 内服务的数据。我对这种冒犯感到非常满意。

public class PackageViewModel()
{
    public PackageDetail{get;set;}
    public int PackageID{get;set;}
    public List<Package>Packages{get;set;}
    public string SomeFilterCriteria{get;set;}

    publlic void FillPackageList(IPackageService packageService)
    {       
        Packages = packageService.GetPackages(SomeFilterCriteria);      
    }
}

在控制器中:

public ViewResult ListPackages(PackageViewModel model)
{
    model.FillPackageList(PackageService);
    return View("ListPackages",model);

}

我不明白您所说的“查看模型构建器”是什么意思。

于 2009-08-06T19:07:38.230 回答
2

控制器应该协调您希望在视图中发生的所有操作。如果您将此逻辑提取到操作过滤器中,它仍然会为每个路由请求执行逻辑,在您的情况下它会更干净。

于 2009-08-06T18:11:48.980 回答