使用ASP.NET Core 3.x 构建 RESTful API P9 P10 Entity Model 与 面向外部的Model

使用ASP.NET Core 3.x 构建 RESTful API P9 P10 Entity Model 与 面向外部的Model


理论

Entity Model

  • Entity Framework Core使用的Entity Model是用来表示数据库里面的记录 即 实体模型.

面向外部的Model

  • 面向外部的model 则表示了要传输的东西,这类model有时候叫做Dto,有的时候叫做ViewModel.

例子:内部model

public class Person
{
	public Guid Id {get;set;}
	public string FirstName {get;set;}
	public string LastName {get;set;}
	public DateTimeOffset DateOfBirth{get;set;}
}

外部model

	public class PersonDto
	{
		public Guid Id {get;set;}
		public string Name {get;set;}
		public int Age {get;set;}
		public decimal Salary {get;set;}
	}

描述: 比方说我们有一张叫Person的库表,Person类是用来对应这张表的,这时候我们有一个消费者需求,他想要知道数据库中关于Person的一些信息,比如姓名,年龄,以及薪资,那么我们就需要将Person的数据处理成消费者想要的数据,比如将FirstNameLastName拼接成PersonDto类的成员Name的值,以及去到和Person表有关的表中,去检索指定Person的薪资,用来填充PersonDto的成员Salary的值,那么这个PersonDto就是用来暴露给消费者的信息类.

通过上述业务逻辑的分析,我们得出一个结论,即我们需要将Entity Model和面向外部的Model分开,使得 API 更加的健壮,可靠和更易于进化.

为什么可以做上述总结呢?
比如:

  1. 当我们业务发生了变化,如数据库结构发生了变化,某个表发生了变化,甚至某个字段名称发生了调整,我们不应该修改对外Model的字段名,因为这样会影响消费者的使用,那么我们只需要调整 Entity Model 即可.
  2. 如果我们将Entity Model 直接作为对外的Model的话,那么我们对API进行版本控制的时候,也会很麻烦,因为这样的话,数据库和Web API 就没有办法各自独立的根据业务进行进化了,所以Entity Model 和 面向外部的Model 应该分开.

应用

针对已有表实体 Company.cs我们编写一个对外的Model CompanyDto.cs,代码如下:

 public class CompanyDto
 {
     public Guid Id { get; set; }
     public string Name { get; set; }
 }

我们修改CompaniesController 下的 Action方法 GetCompanies 代码如下:

/// <summary>
        /// 获取所有公司信息
        /// </summary>
        [HttpGet]
        public async Task<IActionResult> GetCompanies()
        {
            var companies = await this._companyRepository.GetCompaniesAsync();

            if (companies == null)
            {
                return NotFound();  // 404 NotFound  
            }

            //return Ok(companies);

            // 对外实体的转换
            var companyDtos = new List<CompanyDto>();

            foreach (var item in companies)
            {
                companyDtos.Add(new CompanyDto
                {
                    Id = item.Id,
                    Name = item.Name
                });
            }

            return Ok(companyDtos);
        }

运行后查看请求结果如下:
请求结果

由此可见我们的实体转换是奏效的,下一篇博客将介绍 AutoMapper以及IActionResult接口.

posted @ 2020-03-31 21:58  HelloZyjS  阅读(222)  评论(1编辑  收藏  举报