模型 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 UserListPageViewModel
和 IReadOnlyList<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”区域等。
我是 Web 开发的新手,我很难区分模型 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 UserListPageViewModel
和IReadOnlyList<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”区域等。
- “用户列表”页面将有