为什么要映射控制器中的实体
本文关键字:实体 控制器 映射 为什么 | 更新日期: 2023-09-27 18:20:01
经过一些研究,我发现几乎每个人都将从服务中检索到的实体映射到Controller中的(视图)模型。在我看来,这带来了一个实施问题。控制器负责隐藏/显示特定数据,而不是服务/业务逻辑。例如,对于用户对象,密码字段将从服务层转移到控制器,因为它在实体中,然后控制器必须强制将其隐藏。
经过思考,我想出了另一种方法:存储库层返回实体。在服务层中,实体被映射到一个模型上,对于ViewModels,我制作了一个单独的分部类,扩展模型以添加MVC的元数据(用于验证):
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(MyClassMetadata))]
public partial class MyClass
{
private class MyClassMetadata
{
[Required]
public int Id;
[Required]
[StringLength(100)]
public string Name;
}
}
其次,当一个实体需要一个关系实体时,例如,一个城市在存储在数据库中之前需要对一个国家的引用,将城市发送回服务而不附加国家是很奇怪的。这使得检索国家将在控制器中。不过,在我看来,这应该是由服务执行的操作(可能与另一个服务或存储库一起执行)
因为以上不是一般的做法,我担心会忽略什么?当我像上面那样实现它时,我会遇到(不可预见的)问题吗?
我可以回答您的第一个问题,但不能回答第二个问题(关于使用ORM的关系实体),因为我缺乏N层和ORM的经验。
对于您的第一个问题,它旨在在表示层中有一些(视图)模型。当您有特定于UI的逻辑(如屏幕位置、css样式等)需要设置时,视图模型将有助于保存这些信息。
假设您需要检索1000个请求。在这些请求中,有300个未排序的错误请求和200个警告请求。您需要在网格中显示这些请求,并使用自定义样式(例如错误请求的红色字体等)。
一种最简单的方法是将css类分配给每个请求,并使用该类来确定每个请求的样式。
对于第二个问题,我相信提供GetCity
和GetCityWithCountry
等不同的方法将满足关系实体的要求。但这只是我的2美分。