使用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
的数据处理成消费者想要的数据,比如将FirstName
与LastName
拼接成PersonDto
类的成员Name
的值,以及去到和Person
表有关的表中,去检索指定Person的薪资,用来填充PersonDto
的成员Salary
的值,那么这个PersonDto
就是用来暴露给消费者的信息类.
通过上述业务逻辑的分析,我们得出一个结论,即我们需要将Entity Model和面向外部的Model分开,使得 API
更加的健壮,可靠和更易于进化.
为什么可以做上述总结呢?
比如:
- 当我们业务发生了变化,如数据库结构发生了变化,某个表发生了变化,甚至某个字段名称发生了调整,我们不应该修改对外Model的字段名,因为这样会影响消费者的使用,那么我们只需要调整 Entity Model 即可.
- 如果我们将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
接口.