gpt4 book ai didi

c# - 数据注释和 MVC 1 :1 ViewModel

转载 作者:行者123 更新时间:2023-12-02 19:34:50 25 4
gpt4 key购买 nike

在 ASP.NET MVC 中进行开发时,我使用 1:1 ViewModel 设置,其中 View 模型仅包含 View 所需的数据。我还使用数据注释在 View 模型上进行验证。

我担心这不遵循 DRY 原则,因为我发现自己必须在整个网站上重复验证。我希望在一个地方(我的域模型)进行验证,但因为我从不将域模型发送到 View 模型,所以这是不可能的。

我想知道是否有其他人遇到过这个问题并找到了合适的解决方法或有更好的解决方案?

最佳答案

当我们采用 1:1 ViewModel 方法时,我们也有类似的担忧。我们发现 1) 重复次数比最初出现的要少,2) 应用程序的整体可维护性和功能得到了足够的改进,任何非 DRY 成本都是值得的。

我们最终从不同的角度考虑了 ViewModel 和域模型的验证(关注点分离)。在域级模型上实现验证时,我们正在寻求全面的安全性来防止攻击。我们还检测到严重的“契约(Contract)”违规行为,表明上层存在错误。在 View 模型中实现验证时,我们严格关注可用性。

如果您从这些不同的角度来处理模型,那么重叠的部分就会比您想象的要少。出于可用性原因,域层可能允许您在 ViewModel 中限制的某些操作。或者 ViewModel 可能会假设仅发布渲染 View 的输入,依靠域模型进行旨在防止攻击的全面安全验证。

1:1 ViewModel 还极大地简化了可测试性。 ViewModel 的测试可以独立于域层编写,这使得单元测试更轻、更易于维护并且通常更有用。同样,您可以测试域模型,而无需对输入如何流经用户界面进行心理扭曲。这也遵循了“纵深防御”的安全原则。

我们还注意到 View 的更改比域层更频繁。知道您在域模型上获得了非常好的安全单元测试覆盖率,并且当您实现新 View 时,您只需要从可用性角度担心验证,这会让您感到很欣慰。

最后,如果您期望拥有一个 Web 服务层,您会发现域模型和 View 模型的分离会带来好处。如果没有它,领域模型将不可避免地被编写来支持 UI。当您在服务接口(interface)上分层时,您会发现存在阻抗不匹配。

如果最终确实存在大量重复,您始终可以单独分解验证。根据我们的经验,由于上述所有原因,这并不值得。

关于c# - 数据注释和 MVC 1 :1 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2978142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com