模型 class 和数据 class 有什么区别?

What is difference between model class and data class?

我是 Web 开发的新手,我很难区分模型 class 和数据 class,特别是在实施它们时。

我找到了 并且我有点理解了它的理论:数据 class 包含关于对象的所有核心信息,而模型 class 只包含以下信息需要曝光。所以我可以有这样的用户数据 class:

public class User {
    public long Id { get; set; }

    public string Name { get; set; }

    public string Password { get; set; }

    public string Email { get; set; }

    public int Score { get; set; }
}

登录页面的模型class如下:

public class UserModel {
    [Required]
    public string Password { get; set; }

    [Required]
    [EmailAdress]
    public string Email { get; set; }
}

而且我必须创建另一个模型 class 来注册,例如,添加 Name 属性。但是我是否需要为每个新模型重复相同的属性?模型是否需要继承 User 数据 class?所有这些都特定于 MVC 模式吗?模型class和数据class在实际实现中是如何相互关联的?

如果有帮助,我正在使用 Blazor WebAssembly。

我注意到在 ASP.NET Core、ASP.NET MVC(较旧且已被 ASP.NET Core 取代)、Razor 和 Blazor 的上下文中,术语“模型”是“viewmodel”的 shorthand。不要将它与“实体模型 class”混淆,我相信您指的是“数据 class”。

But do I need to be repeating the same properties for each new model?

是(有例外,例如当您作曲 view-models)

Do the models need to inherit from User data class?

不,不要那样做。

虽然两个或多个不同类型(classes)可能共享相同的成员,但这并不意味着它们代表相同的“事物”。在OOP中,继承应该只用来表示“是”关系,而不是“有”关系,尤其不是“I'm-too-lazy-to-have-to-declare-all-of-my-members-again-argh”(虽然我是对最后一个感到非常内疚......)。

不幸的是,C#(还)不支持 mixins,这个术语用于描述 object-oriented 语言具有多个不同类型的能力成员 没有 表达这些类型之间的任何类型的实际关系。

that C# 8.0 on .NET Core 3.0 supports _quasi-_mixins with Default Interface Implementation 除外,但与真正的 mixins 相比它有局限性,例如我知道你不能使用这种方法导入 operator-overloads、转换运算符或构造函数,我我认为 w.r.t。virtual 成员也有一些限制 - 我认为它根本不适用于 structs(至少没有装箱,这对性能不利))。

Is all of this specific to MVC pattern?

MVC 设计在每个 Web 框架中都很常见,真的 - 不仅是 ASP.NET Core 或 ASP.NET MVC,还有 Python、PHP 的 MVC 框架, Ruby,等等

How do the model class and the data class relate to each other in the actual implementation?

  • 在您的项目中给定一个 域实体 (在本例中为“用户”):
    • 实体(“数据”)class 将对象表示为业务对象,以及它在数据库中的存储方式。
    • 每个 View-Model(“模型”)class 代表您业务领域的特定 视图(可能是 read-only 或read-write) 这通常是您的业务域对象图子集的 快照 以及包含页面本身的其他属性(例如页面 <title> ,当前 logged-in 用户的详细信息等)。
      • 请注意,单个域实体 class 可以有多个 view-model class 来表示它(见下文)。同样,一个 view-model 可以表示多个域实体对象(或者 none)。

例如:

  • 给定一个 class User(您的实体 class):
    • “用户列表”页面将有 class UserListPageViewModelIReadOnlyList<User> 属性。
    • “编辑用户”页面将有一个 class EditUserPageViewModel,其中包含每个可编辑用户的属性 property/column/attribute。
      • 但它绝不能暴露User class model-binding,因为这样攻击者就可以发送假的POST 表单请求,例如指示 model-binder 覆盖 Password 字段。
    • “欢迎页面”view-model 还可能包含一个 public User CurrentUser { get; } 属性,其中包含一个加载的 User 实例,其中包含“布局”.cshtml 文件(又名 .master Aspx 中的“母版页”,或任何一种常见的 HTML 模板等)将用于填充“欢迎 John Doe”区域等。