2012-11-20 37 views
2

在我的项目中,我有一个服务层,它接收来自控制器的对象,将其转换为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); 
     } 
    } 

所以,我有关于一些问题:

  1. 它是一个很好的架构?
  2. 我应该将dto映射到服务中的实体还是只映射到存储库中?
  3. 是否有任何问题使我的dto等于我的实体?
  4. 我很愚蠢,因为很多教程都没有在控制器中直接使用dbContext?

回答

1

我会尽量回答一些问题。

1 - 这是一个很好的建筑吗?

也许吧。如果您使用的是ORM工具(如NHibernate,Entity Framework),您必须认为您不能从ORM工具共享您的瞬态对象,因为有时您有代理,而不是混合类型。我不想直接从ORM工具发送视图。我更喜欢使用viewModel或DTO。

2 - 我应该将dto映射到服务中的实体还是仅映射到存储库中?

也许,服务应返回ViewModel,因为是需要,但有时您需要直接在Query上指定结果并从Repository中获取结果。

3 - 是否有任何问题使我的dto等于我的实体?

不,有时您可以拥有一个拥有50个属性的实体,并且您需要在视图上仅显示5或6个属性的网格,因此,您必须创建一个具有这5或6个属性的ViewModel并将其转换为实体到ViewModel类型。

有一个很好的工具叫AutoMapper,可以帮助你映射对象。你应该考虑使用它。

Jimmy Bogard用Asp.Net MVC和AutoMapper实现了一个很好的实现,它清理帖子,并通过ViewModel采用asp.net mvc的面向对象编程的最佳实践。

http://lostechies.com/jimmybogard/2011/06/22/cleaning-up-posts-in-asp-net-mvc/

+1

您也可以使用[EntitiesToDTOs(http://entitiestodtos.codeplex.com)自动生成从EDMX文件的DTO和汇编。 – kzfabi

+0

我知道AutoMapper,但我每天都问自己是否真的有必要拥有一个dto平等的实体。目前我使用DTO,但我认为这有点无聊。 – MuriloKunze

+1

是的,我理解你的观点。想象一下,如果你有一个来自ORM的瞬态对象(代理)并将它发送到你的视图,那么它可以正常工作,但是,想象你在你的视图中从你的实体调用了一个懒惰属性,所以你的视图碰到了数据库,所以它有必要有一个'ViewModel',因为它应该准备好视图需要显示的内容,这些内容都是由控制器处理的。正因为如此,有像AutoMapper,EntitiesToDTO等工具... –