【问题标题】:ASP.NET Core 3.1 DI with ViewModel's Parameterless Constructor带有 ViewModel 无参数构造函数的 ASP.NET Core 3.1 DI
【发布时间】:2021-04-05 09:35:40
【问题描述】:

我的 Controller 的 HttpPost 方法都以 ViewModels 作为参数。 显然 ViewModel 需要一个无参数的构造函数。

我还需要通过参数化构造函数将我的 DbContext 服务注入到我的 ViewModel 中。

其他人是如何处理这种看似不可能的情况的?

【问题讨论】:

  • 您的问题似乎与这个问题有关:stackoverflow.com/questions/45775740/…。但我认为,如果您需要将 DbContext 注入 ViewModel,那么您的 VM 做得太多了。
  • 我猜你是在建议从其他可以注入 dbcontext 的类中填充 ViewModel?谢谢。
  • 是的,我会在业务逻辑类/服务中填充 VM 并将其返回给控制器;或者如果有必要,直接在 Controller 中(如果代码不多,我尽量让我的控制器很薄)
  • ViewModel 在 asp.net 中与 ViewModel 在其他一些模式中有些不同(例如:MVVM 在 wpf 中使用)。这里的ViewModel 主要只包含数据,以便View(Razor 视图/页面)可以用来呈现 HTML 内容。反过来(处理从客户端发送的请求),VM 将成为您获取客户端发送的数据的地方(在 ASP.NET/core 框架的帮助下,为您执行称为 model binding 的预处理)。客户端-服务器方式要求 VM 具有无参数构造函数,而另一种方式则没有。我们通常为两种方式使用同一个虚拟机。

标签: asp.net-core dependency-injection asp.net-core-mvc viewmodel


【解决方案1】:

MVC 上下文中的视图模型通常期望为POCOs,并且只是充当控制器和视图之间的某种数据传输对象。因此,它们应该很少包含任何逻辑,并且绝对不需要像您的数据库上下文这样的外部依赖项。

相反,您应该考虑让其他东西负责使用您的数据库上下文来创建一个视图模型。这可能是某个服务类,或者只是控制器操作中的直接逻辑。

这可能看起来像这样:

public class ExampleController : Controller
{
    private readonly DataContext _db;
    public ExampleController(DataContext db)
    {
        _db = db;
    }

    public async Task<IActionResult> Index()
    {
        var items = await _db.Items.Where(i => i.State == ItemState.Active).ToArrayAsync();

        var vm = new IndexViewModel
        {
            Items = items,
            Date = DateTime.Today,
        };
        return View(vm);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2018-04-04
    • 2020-04-08
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多