DTO的属性等于实体的属性

时间:2012-11-20 15:06:29

标签: 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 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 direct这很愚蠢吗?很多教程教授?

1 个答案:

答案 0 :(得分:1)

我会尝试回答一些问题。

1 - 这是一个很好的架构吗?

也许。如果您正在使用诸如NHibernate,Entity Framework之类的ORM工具,您必须认为您无法从ORM工具共享您的瞬态对象,因为有时您有代理,而不是混凝土类型。我不喜欢直接从ORM工具发送到视图对象。我更喜欢使用viewModel或DTO。

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

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

3 - 让我的dto等于我的实体有什么问题吗?

不,有时您可以拥有一个包含50个属性的实体,并且您需要在仅具有5或6个属性的View上显示网格,因此,您必须创建具有这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/