zoukankan      html  css  js  c++  java
  • 使用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接口.

  • 相关阅读:
    【C#】:浅谈反射机制 【转】
    ArcGIS Server 10中的切图/缓存机制深入【转】
    ArcGIS Server的切图原理深入【转】
    【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
    MFC 带Ribbonbar的窗口 实现全屏和取消全屏
    C#.net开发 List与DataTable相互转换 【转】
    Net编程 详解DataTable用法【转】
    三维空间两直线/线段最短距离、线段计算算法 【转】
    OSG立体模式下动态修改相机远近裁剪面的实现
    用curl去探测接口是否正常返回结果,若没有正常返回则触发报警
  • 原文地址:https://www.cnblogs.com/HelloZyjS/p/12608924.html
Copyright © 2011-2022 走看看