Asp.net mvc DTO';s属性等于实体';s属性
在我的项目中,我有一个服务层,它从控制器接收一个对象,将其转换为DTO并发送到存储库。 我想问题是,对于我项目中的每个实体类,我都需要一个具有完全相同实体属性的DTO。 让我展示一些代码:Asp.net mvc DTO';s属性等于实体';s属性,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,在我的项目中,我有一个服务层,它从控制器接收一个对象,将其转换为DTO并发送到存储库。 我想问题是,对于我项目中的每个实体类,我都需要一个具有完全相同实体属性的DTO。 让我展示一些代码: public class PersonDto { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } };
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);
}
}
因此,我有一些问题:
我将尝试回答一些问题 1-这是一个好的架构吗 也许吧。如果您使用的是ORM工具,如NHibernate、Entity Framework,您必须认为您无法从ORM工具共享瞬态对象,因为有时您有一个代理,而不是concret类型。我不喜欢直接从ORM工具向视图发送对象。我更喜欢使用viewModel或DTO 2-我应该将dto映射到服务中的实体还是只映射到存储库中的实体 也许,服务应该返回
ViewModel
,因为视图需要它,但有时您需要直接在查询中指定结果,并从存储库中获取它
3-使我的dto等于我的实体是否有任何问题
不,有时您可以有一个具有50个特性的图元,并且您只需要在具有5个或6个特性的视图上显示栅格,因此,您必须使用这5个或6个特性创建ViewModel,并将图元转换为ViewModel类型
有一个很好的工具叫做,可以帮助你映射对象。你应该考虑使用它。< /P>
Jimmy Bogard在Asp.Net MVC和AutoMapper中有一个很好的实现,介绍了如何使用ViewModel通过Asp.Net MVC进行面向对象编程的最佳实践来清理POST和GET
您还可以使用从EDMX文件自动生成dto和汇编程序。我知道AutoMapper,但我每天都会问自己,是否真的有必要让dto与实体相等。我现在用DTO,但我觉得有点无聊。是的,我理解你的意思。想象一下,如果您有一个来自ORM的临时对象(代理)并将其发送到您的视图中,它可以正常工作,但是,想象一下,在您的视图中,您从实体调用了一个惰性属性,因此,您的视图访问了数据库,因此,有必要拥有一个ViewModel
,因为它应该准备好视图需要显示的、由控制器处理的所有内容。正是因为这个原因,有像AutoMapper、EntitiesToToTo等工具。@FelipeOriani这就是为什么我使用DTO,不直接在视图中显示实体类的原因。在我的项目中,我将dal与MVC项目完全隔离,只使用DTO在所有层之间传输。但我看到很多操作系统教程,他们只是在Controller中使用dbContext,我不明白他们为什么这么做。是的,我同意你的看法。网络上的一些教程只是为了说教,没有很好的责任分离,他们只是想展示这些技术是如何协同工作的。DTO/ViewModels/VO很适合只将必要的数据传输到视图,而不需要ORM工具的基础结构或分布式层。如果您想了解更多关于体系结构的信息,我真的建议您查看此项目->。。。它在asp.NETMVC的体系结构上具有NH/EF、WCF、DDD、TDD等良好的实践。。