C# 如果我们在API中不使用DTO会发生什么?
例如:Student是域模型,我在API操作方法中直接使用Student对象C# 如果我们在API中不使用DTO会发生什么?,c#,asp.net-web-api,C#,Asp.net Web Api,例如:Student是域模型,我在API操作方法中直接使用Student对象 // Domain Model. pubic class Student { public int Id { get; set; } public string FirstName{ get; set; } public string LastName { get; set; }
// 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);
}
这很好,因为DTO就是它的意思,数据传输对象。除非您的视图有不同的需求,否则使用基于DTO的模型是可以的 这很好,因为DTO就是它的意思,数据传输对象。除非您的视图有不同的需求,否则使用基于DTO的模型是可以的 您有机会向不受信任的客户端公开域模型。 大多数情况下,DTO较轻,因此传输的数据较少。 有时域模型包含复杂的类型
public class Student
{
//...
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int Id { get; set; }
//...
}
这可能无法使客户满意。您必须序列化域对象或使用DTO展平对象
如果您不使用DTO,您的API将随着您的域模型而发展。当您的API为公共API时,这可能会破坏您的外部消费者应用程序。
您有机会向不受信任的客户端公开域模型。
大多数情况下,DTO较轻,因此传输的数据较少。
有时域模型包含复杂的类型
public class Student
{
//...
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int Id { get; set; }
//...
}
这可能无法使客户满意。您必须序列化域对象或使用DTO展平对象
如果您不使用DTO,您的API将随着您的域模型而发展。当您的API为公共API时,这可能会破坏您的外部消费者应用程序。
这真的会在将来为你节省时间。我的意思是,如果您正在开发真正的长期解决方案,您必须使用DTO,并使您的代码更加结构化。你必须有不同的层。像数据层、表示层、业务层等,所有这些层都应该是独立的。如果使用DTO,则可以创建更多特定的实体。不会混淆您的业务逻辑 我也看到了这一点。也许它会给你一些DTO可以帮助你的例子 DTO数据传输对象是用于移动数据的数据容器 在层之间。它们也称为传递对象。DTO只是 用于传递数据,不包含任何业务逻辑。他们只是 拥有简单的二传手和接球手
这真的会在将来为你节省时间。我的意思是,如果您正在开发真正的长期解决方案,您必须使用DTO,并使您的代码更加结构化。你必须有不同的层。像数据层、表示层、业务层等,所有这些层都应该是独立的。如果使用DTO,则可以创建更多特定的实体。不会混淆您的业务逻辑 我也看到了这一点。也许它会给你一些DTO可以帮助你的例子 DTO数据传输对象是用于移动数据的数据容器 在层之间。它们也称为传递对象。DTO只是 用于传递数据,不包含任何业务逻辑。他们只是 拥有简单的二传手和接球手
1.您正在公开您的内部域2。如果学生有您不想发送给客户端的字段,该怎么办?比如说,你还想用什么?我不明白你的问题。希姆布罗姆比尔。。。我在问这个!在上面的例子中,student是一个域模型,我在api操作方法中使用student对象。。。例如,如果我创建一个dto,而不是使用student对象,我就是studentDTO!!!!那么,这两种方法之间的确切区别是什么呢?我是asp.web api的新用户。。{我很困惑}.1。您正在公开您的内部域2。如果学生有您不想发送给客户端的字段,该怎么办?比如说,你还想用什么?我不明白你的问题。希姆布罗姆比尔。。。我在问这个!在上面的例子中,student是一个域模型,我在api操作方法中使用student对象。。。例如,如果我创建一个dto,而不是使用student对象,我就是studentDTO!!!!那么,这两种方法之间的确切区别是什么呢?我是asp.web api的新用户。。{我很困惑}。我认为这一定不是一个好词。编程中没有什么是必须的。DTO不是必须的。当然,我的意思不是用域对象代替DTO。另外,分层体系结构并不是所有情况下都能成功的秘诀。@MichałK.是的,这一点很好。但使用分层体系结构是长期项目成功的标准之一。使用DTO是使用分层架构的一个例子。我不同意。并非所有长期运行的项目都必须具有分层体系结构。你应该看Jimmy Bogard谈论垂直切片架构。它绝对美丽而简单。这是一个最好的部分-他有Github的完整的解决方案如何。所以这不仅仅是理论上的@米夏克,当然由你决定。不管你想要什么。如果你不同意“必须”这个词,我可以改变它!你不必改变你的观点,见鬼,你甚至不必看演讲。我刚才给你们举了一个不那么分层的架构的例子,这让我很惊讶。不多不少我不认为那一定是好事
d这个词。编程中没有什么是必须的。DTO不是必须的。当然,我的意思不是用域对象代替DTO。另外,分层体系结构并不是所有情况下都能成功的秘诀。@MichałK.是的,这一点很好。但使用分层体系结构是长期项目成功的标准之一。使用DTO是使用分层架构的一个例子。我不同意。并非所有长期运行的项目都必须具有分层体系结构。你应该看Jimmy Bogard谈论垂直切片架构。它绝对美丽而简单。这是一个最好的部分-他有Github的完整的解决方案如何。所以这不仅仅是理论上的@米夏克,当然由你决定。不管你想要什么。如果你不同意“必须”这个词,我可以改变它!你不必改变你的观点,见鬼,你甚至不必看演讲。我刚才给你们举了一个不那么分层的架构的例子,这让我很惊讶。不多不少