Asp.net mvc DTO';s属性等于实体';s属性

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; } };

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

  • 我将尝试回答一些问题

    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等良好的实践。。