2

在我的项目中,我有一个服务层,它从控制器接收对象,将其转换为 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 是不是很愚蠢?
4

1 回答 1

1

我将尝试回答一些问题。

1 - 它是一个好的架构吗?

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

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

也许,服务应该返回ViewModel,因为这是 View 需要的,但有时您需要直接在 上指定结果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/

于 2012-11-20T16:45:09.947 回答