Asp.net mvc ASP.NET MVC ViewModelBuilder建议

Asp.net mvc ASP.NET MVC ViewModelBuilder建议,asp.net-mvc,architecture,model,view,Asp.net Mvc,Architecture,Model,View,对于除普通视图模型以外的任何对象,我都使用一个视图模型生成器来处理生成视图模型对象的责任。现在,我使用构造函数将构建器注入到我的控制器中,但这有点异味,因为构建器实际上依赖于正在执行的操作方法。我有两个想法。第一个是一个定制的ActionFilter,允许我用合适的生成器来修饰每个action方法。第二种方法是添加对视图方法的覆盖,该方法可以接受泛型 这就是我的代码目前的样子。注意,生成器是通过ctor注入的 [HttpGet, ImportModelStateFromTempData,

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

这就是我的代码目前的样子。注意,生成器是通过ctor注入的

    [HttpGet, ImportModelStateFromTempData, Compress]
    public ActionResult MyAccount()
    {
        return View(accountBuilder.Build());
    }
以下是选项一的外观:

    [HttpGet, ImportModelStateFromTempData, Compress, ViewModelBuilder(typeof(IMyAccountViewModelBuilder)]
    public ActionResult MyAccount()
    {
        return View();
    }
或选择二:

    [HttpGet, ImportModelStateFromTempData, Compress]
    public ActionResult MyAccount()
    {
        return View<IMyAccountViewModelBuilder>();
    }
[HttpGet,ImportModelStateFromTempData,Compress]
公共行动结果MyAccount()
{
返回视图();
}
任何想法或建议都会很好

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

[HttpGet, ImportModelStateFromTempData, Compress]
public ActionResult MyAccount()
{
   return View( AccountBuilder.Build<MyAccountViewModel>( ) );
}
[HttpGet,ImportModelStateFromTempData,Compress]
公共行动结果MyAccount()
{
返回视图(AccountBuilder.Build());
}
关于候选人 第一种选择 上述方法允许您在动作内部渲染的视图中具有更大的灵活性(如果控制器在3个视图中选择显示,并且每个视图都有不同的视图模型,会发生什么情况?过滤器解决方案开始变得复杂。)

第二选择
查看方法的职责是获取模型并使用它渲染视图。控制员负责建立模型。因此,有点正统,我建议避免将模型构建逻辑放在视图方法中:)。

如果您正在征求意见,现在看到您的代码,我将投票支持您的第一个选项。我已经广泛使用了这种方式的动作过滤器,这很好-一切都在一个地方,支持简单的装饰动作,等等。

您的视图模型动作过滤器可以查看ViewContext上的预期模型类型,而不是在属性中要求它。

可能会发布一些代码,以便我们更好地了解您在做什么。但是我认为你在这篇文章中按照模式3做了一些事情,尽管我不知道你想要改变什么?我也对这个感兴趣。我很好奇你的代码是什么样子的,或者你对它的设想是什么样子的。我相信你的第一个选择就是我目前正在做的事情。AccountBuilder是否知道如何为控制器构建所有ViewModel对象?现在第二个选项,我设想的是视图方法覆盖,使用服务定位器抓取构建器并用结果设置模型属性。@Marco:Hi-Marco!,与当前方法的不同之处在于,类型是指定给生成器对象的(在示例代码中不是):)。是的,AccountBuilder将知道如何为控制器构建所有viewModel对象(它们彼此非常相关)。关于第二位候选人,我认为它很有独创性:)。但是我建议不要将这一职责委托给视图方法,也许您可以在builder对象中使用服务定位器思想得到一个很好的结果:)。你好,SD