ASP.NET MVC - 控制器的职责

3
我开始对MVC中控制器的工作感到困惑。
我有一个服务,提供了五个函数:
列出队列中的包裹
获取包裹
删除包裹
接受包裹
拒绝包裹
我的ASP.NET MVC控制器依赖于这个服务,并且通常可以在操作上执行服务调用。到目前为止,我很满意。
然后是构建ViewModel结果的第二部分。如果我在控制器中完成这一步骤,那么控制器现在就有了一个爆炸性的依赖列表——每个添加的操作都会增加构建视图模型的依赖关系,并且这些依赖关系都被控制器继承。我不太喜欢这样。我正在构建这个依赖于N个不同视图模型构建器的控制器,但每个请求只使用其中一个。
所以,我考虑将所有这些内容提取出来,并针对每个视图模型应用特定的操作过滤器。我还没有做到这一点,但这似乎还好。
这让我产生了一个问题:控制器的职责是什么?如果我最终将视图模型构建放入过滤器中,我的控制器除了执行服务调用(并提供一个过滤器插件)之外几乎没有其他作用。如果我让我的控制器负责构建每个视图模型,它就会变得一团糟。
看起来我几乎想为每个请求实例化一个操作,而不是一个控制器,并且我只是滥用了过滤器?

这个问题非常需要一些代码示例。 - John Sheehan
2个回答

4

您是否有专用的ViewModel和Poco-Model?如果是这种情况,您可以在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);

}

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

“View model builders” 可能指的是将 DTO 中的值分配给 viewmodel 对象。我目前在我的控制器中执行此操作 - 不确定这是否是正确的做法,但我看到的另一种选择是将 DTO 传递给 viewmodel 的构造函数,但我不确定哪种方式更好。 - Sinjai

2

控制器应该编排在视图中希望发生的所有操作。如果您将此逻辑提取到操作筛选器中,则仍然会执行每个路由请求的逻辑,只是在您的情况下更加整洁。


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