如果我们在API中不使用DTO,会发生什么?

时间:2018-12-10 14:32:18

标签: c# asp.net-web-api

例如:“学生”是域模型,我直接在我的API Action方法中使用“学生”对象。

        // Domain Model.
        pubic class Student
        {
            public int Id { get; set; }
            public string FirstName{ get; set; }
            public string LastName { get; set; }
            public string Gender{ get; set; }
            public DateTime? BirthDate { get; set; }
        }

       //Simple API method that Add new student details to the database.
       [HttpPost]
       public IHttpActionResult GetStudents(Student student)
       {
           if (!ModelState.IsValid)
               return BadRequest();

              _context_.student.Add(student);
              _context_.SaveChanges();
              return Created(new Uri(Request.RequestUri + "/"), student.Id);
       }

3 个答案:

答案 0 :(得分:3)

  1. 您有机会向不受信任的客户公开您的域模型。
  2. 在大多数情况下,DTO较轻,从而导致传输的数据更少。
  3. 有时域模型包括复杂的类型。

    public class Student
    {
        //...
        public ICollection<Course> Courses { get; set; }
    }
    public class Course
    {
        public int Id { get; set; }
        //...
    }
    

这可能无法使客户满意。您必须序列化域对象或使用DTO展平该对象。

  1. 如果您不使用DTO,则您的API将随着您的域模型而发展。当您的API公开时,这可能会破坏您的外部使用者应用。

答案 1 :(得分:1)

很好,因为DTO就是数据传输对象。除非您的视图有不同的需求,否则使用基于DTO的模型就可以了。

答案 2 :(得分:1)

这确实可以节省您将来的时间。我的意思是,如果您要开发长期的解决方案,则必须使用DTO并使代码更加结构化。您必须具有不同的层。像数据层,表示层,业务层等。所有这些层都应该是独立的。如果使用DTO,则可以创建更多特定的实体。无需混淆您的业务逻辑。

我也看到了这个article。可能会为您提供一些示例,其中DTO可以为您提供帮助。

  

DTO(数据传输对象)是用于移动数据的数据容器   层之间。它们也称为传输对象。仅DTO   用于传递数据,不包含任何业务逻辑。他们只   有简单的设置方法和获取方法。