为了回答您的具体问题,我将更全面地介绍您的架构。您为项目设计的体系结构与DDD使用的典型体系结构略有不同。虽然您分配职责的方式很典型,但在DDD中,域类不对其自身的持久性负责。事实上,DDD的口头禅是 坚持无知 。这基本上意味着域类是持久性无知的 - 它们没有 Save 方法。相反,应用程序服务(架构中的应用程序外观层)与存储库协调以重构和持久化域实体。
Save
接下来,在实现存储库时,通常不需要在底层持久性技术和域类之间使用显式DTO。对于诸如NHibernate和EF之类的ORM,域类和关系表之间的映射用映射类或基于XML的配置表示。因此,您的域类是隐式映射的 - 不需要DTO。有些情况下会调用DTO,在这种情况下,DTO和域类之间的映射应该由存储库实现封装。这是您可以调用AutoMapper的地方。
最后,通常的做法是使用DTO在表示层和应用程序/域层之间进行通信。要确定映射的确切位置,您必须深入挖掘最适合您项目的体系结构。大多数现代DDD架构都基于 六角形建筑 。在六边形体系结构中,您的域位于中心,所有其他“层”使域适应特定技术。例如,存储库可以看作是 适配器 域与特定数据库技术之间。 ASP.NET WebAPI可以看作域和HTTP / REST之间的适配器。同样,表示层可以看作域和特定域之间的适配器。 DTO可以在每个适配器中显示,并且适配器负责映射到这些DTO以及从这些DTO映射。
一个典型的例子是使用应用程序服务在您的域上建立一个外观。没有DTO在玩。接下来,使用ASP.NET WebAPI(适配器)创建服务层(DDD中的开放主机服务)。您可以创建ASP.NET WebAPI特定的DTO,这个适配器可以映射到这些DTO以及从这些DTO映射。因此,如果您使用AutoMapper,则应在此图层中调用它。这可以明确地或以一种方式完成 面向方面 与动作过滤器的方式。表示层也是如此。表示层可以直接耦合到应用程序服务,也可以耦合到ASP.NET WebAPI开放主机服务。在任何一种情况下,表示层都有责任在域类(来自应用程序服务或来自WebAPI的DTO)和它自己的原语(如ViewModel)之间进行映射。