ASP.NET MVC ViewModelBuilder建议

Mar*_*rco 8 architecture asp.net-mvc model view

对于除了普通视图模型之外的任何东西,我使用视图模型构建器来处理生成视图模型对象的责任.现在,我使用构造函数注入构建器到我的控制器中,但这有点气味,因为构建器实际上依赖于正在执行的操作方法.我有两个想法.第一个涉及自定义ActionFilter,允许我使用适当的构建器来装饰每个操作方法.第二种方法是添加View方法的覆盖,该方法可以接受泛型.

这是我的代码目前的样子.注意,构建器通过ctor注入.

    [HttpGet, ImportModelStateFromTempData, Compress]
    public ActionResult MyAccount()
    {
        return View(accountBuilder.Build());
    }
Run Code Online (Sandbox Code Playgroud)

这是一个看起来像什么的选项:

    [HttpGet, ImportModelStateFromTempData, Compress, ViewModelBuilder(typeof(IMyAccountViewModelBuilder)]
    public ActionResult MyAccount()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

或者选项二:

    [HttpGet, ImportModelStateFromTempData, Compress]
    public ActionResult MyAccount()
    {
        return View<IMyAccountViewModelBuilder>();
    }
Run Code Online (Sandbox Code Playgroud)

任何想法或建议都会很棒!

SDR*_*yes 1

建造者

我认为您可以将构建正确视图模型的责任转移给构建者。您可以将要构建的 ViewModel 类型作为参数传递,例如:

[HttpGet, ImportModelStateFromTempData, Compress]
public ActionResult MyAccount()
{
   return View( AccountBuilder.Build<MyAccountViewModel>( ) );
}
Run Code Online (Sandbox Code Playgroud)

关于候选人

第一个选项这个

上述方法使您可以在操作内渲染的视图中拥有更大的灵活性(如果您的控制器应该在 3 个视图之间进行选择来显示,并且每个视图都有不同的视图模型,会发生什么?过滤器解决方案开始变得复杂。)

第二个选项

View方法的职责是获取模型并使用它渲染视图。构建模型控制器的责任。因此,作为一个有点正统的人,我建议避免将模型构建逻辑放在 View 方法中:)。