在我的项目中,我有一个服务层,它接收来自控制器的对象,将其转换为DTO并将其发送到存储库。 我猜想的问题是,对于我的项目中的每个实体类,我都需要一个具有与实体完全相同的属性的DTO。 让我告诉一些代码:DTO的属性等于实体的属性
public class PersonDto
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
};
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
};
public class PersonController : Controller
{
public ActionResult Create(CreatePersonViewModel createPersonViewModel)
{
var personDto = //here I map createPersonViewModel to a PersonDto
_personCreateService.Create(personDto);
}
}
public class PersonCreateService
{
public void Create(PersonDto personDto)
{
_repository.Create(personDto);
}
}
public class PersonRepository
{
public void Create(PersonDto personDto)
{
Person person = PersonMapper.Map(personDto);
_db.Person.Add(person);
}
}
所以,我有关于一些问题:
- 它是一个很好的架构?
- 我应该将dto映射到服务中的实体还是只映射到存储库中?
- 是否有任何问题使我的dto等于我的实体?
- 我很愚蠢,因为很多教程都没有在控制器中直接使用dbContext?
您也可以使用[EntitiesToDTOs(http://entitiestodtos.codeplex.com)自动生成从EDMX文件的DTO和汇编。 – kzfabi
我知道AutoMapper,但我每天都问自己是否真的有必要拥有一个dto平等的实体。目前我使用DTO,但我认为这有点无聊。 – MuriloKunze
是的,我理解你的观点。想象一下,如果你有一个来自ORM的瞬态对象(代理)并将它发送到你的视图,那么它可以正常工作,但是,想象你在你的视图中从你的实体调用了一个懒惰属性,所以你的视图碰到了数据库,所以它有必要有一个'ViewModel',因为它应该准备好视图需要显示的内容,这些内容都是由控制器处理的。正因为如此,有像AutoMapper,EntitiesToDTO等工具... –