【问题标题】:Using Model or ViewModel in a AspNet Web api [closed]在 AspNet Web api 中使用 Model 或 ViewModel [关闭]
【发布时间】:2021-02-13 15:47:53
【问题描述】:

在 Asp.Net MVC 应用程序中,MVVM 经常用于执行与视图的通信。随着 Web API 的出现,尤其是 Code First 的出现,MVVM 还必须存在吗?

很多人说用 MVVM 没用,因为我们没有视图。

我的建议是您应该始终使用 MVVM,因为您不能将应用程序的模型导出到外部,以避免被黑客入侵的可能性,因为模型反映了数据库的结构,因此如果我们将其直接导出到在外部的 web api 中,我们导出了数据库的结构,并且我们增加了被黑客入侵的可能性,因为外部已知字段和表。

这就是为什么我们必须使用MVVM而不是反映数据库结构的Model。

确实,在 web api 中的视图和控制器之间的通信过程中,我们应该使用 MVVM 还是模型?

如果我们知道数据库的结构,它怎么能被黑客入侵?

感谢您的回复

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core asp.net-web-api asp.net-core-webapi


    【解决方案1】:

    不要依赖Security by obscurity。仅仅因为您试图通过以 ViewModel 的不同形式发送它们来掩盖您的数据库模型不会使您的系统安全。

    这是一种不好的做法,已被广泛拒绝。如果有人想破解您的网站,他/她通常可以在不了解底层数据库的情况下进行操作(以 SQLMap 之类的工具为例)。是的,如果我已经知道您有一个包含散列密码的 Users 表,那么这会让生活变得更轻松一些,但通常这样的事情是基于约定的,黑客可以很容易地猜到。

    使用其他安全机制,如 ORM 和输入/输出清理(注意:不要只依赖其中一个。安全性和安全性是通过多种措施的组合来实现的。)

    回到 MVVM。通常,视图显示来自数据库多个表的聚合信息,因此仍然存在对 ViewModel 的需求,因为您无法使用单个 Databasemodel 填充视图。以您希望查看所有客户、他们的订单和送货地址的视图为例。如果您的数据库被规范化,这很可能不会全部存储在一个表中。

    但这都是非常固执的,并且是特定于用例的。互联网上有很多关于这个主题的文章,所以Is MVVM pointless?Softwareengineering SE

    【讨论】:

    • 事实上,正如他提到的@Ahmed Zakaria,我的意思是DTO,这是真的,隐藏数据库的结构不足以保护IT解决方案,但如果结构为外界所知,则风险更大.以 yahoo 为例,它暴露了天气的服务,我不认为它会暴露 json 对象,这些对象反映了后面使用的数据库的结构,实际上我们在这方面使用了 DTO。这就是我要说的
    • 另一个我认为需要将数据访问层和前端层解耦的原因,确实使用DTO很重要。
    • DTO 和 ViewModel 理论上相似,但概念不同。您最初的问题是针对 ViewModels。 Ofc 将数据库和前端解耦非常重要。我不认为你明白我的意思:“不要依赖默默无闻来保护你的系统”并不意味着我提倡在前端使用数据库模型,因为这无关紧要。我只是想指出,如果仅仅依靠默默无闻,你会把自己置于危险之中。
    【解决方案2】:

    在 web api 中,我们使用一些叫做 dto 的东西来代替 viewModel,DTO 类似于视图模型,但它没有任何关于视图的逻辑,只是为了传输数据 读完这篇文章你就会明白了
    Create Data Transfer Objects (DTOs)

    【讨论】:

    • 感谢 @Ahmed Zakaria 的回答,您对 DTO 的验证有什么想法吗,我应该为我的模型添加相同的 DataAnnotation 吗?
    • 是的,我在 dtos 中使用数据注释,它类似于视图模型,但不同之处在于视图模型可能对视图有一些逻辑.. 如果我的回答对您有帮助,您可以接受它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多