为什么要映射控制器中的实体



经过一些研究,我发现几乎每个人都将从服务中检索到的实体映射到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类分配给每个请求,并使用该类来确定每个请求的样式。

对于第二个问题,我相信提供GetCityGetCityWithCountry等不同的方法将满足关系实体的要求。但这只是我的2美分。

最新更新