3

我想我开始混淆MVC中的控制器的工作。ASP.NET MVC - 作业控制器

我有暴露五大功能服务:在队列

  • GET包
  • 删除包
    • 列表包接受包
    • 否认包

    我ASP.NET MVC控制器依赖于这个服务,和ca n通常在Action上执行服务调用。到目前为止我很开心。

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

    所以我正在考虑把所有这一切都拿出来,并针对每个视图模型应用特定的操作过滤器。我还没有这样做,但似乎没关系。

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

    看来我几乎想要实例化每个请求的操作,而不是控制器,而我只是在滥用过滤器来实现这个目标?

  • +0

    这个问题急需一些代码示例。 – 2009-08-24 06:34:49

    回答

    4

    您是否有专门的ViewModels和Poco-Models?如果是这种情况,您可以处理ViewModel内部服务的数据。 我很高兴与这个uproach。

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

    我不明白你说的 “视图模型建设者” 的意思。

    +0

    “查看模型构建器”可能指的是将值从DTO分配给视图模型对象。我目前正在我的控制器中做这件事 - 不知道这是否是正确的举动,但我看到的另一种选择是将DTO传递给viewmodel的构造函数,我不确定哪个更好。 – Sinjai 2017-09-25 21:53:38

    2

    控制器应该编排您希望在视图中发生的所有操作。如果你将这个逻辑放到动作过滤器中,它仍然按照每个路由请求执行逻辑,在你的情况下它将变得更加清晰。