我见过很多有关的问题的映射 交互 要领域的对象,但我不觉得他们回答我的问题。我已经用许多方法之前有自己的意见,但我在找一些更具体的。

这种情况:

我们有许多领域对象。我们正在使用一个模型里昂证券所以我们域的对象可以是相当复杂的并且他们有自己的数据访问。你不希望通过这些周围的铁丝。我们要写一些新的服务将返回的数据在一定数量的格式(.净式,等等)。为此(原因和其他原因)我们还建立一个精干、数据传送对象来绕过。

我的问题是:应该如何也可与检和领域对象是连?

我的第一反应是使用 福勒,也可与检模型解决方案.我已经看到这种做过很多次而且感觉我的权利。该领域对象包含没有参照也可与检.一个外面的实体(一个"映射器"或"汇编")被称为创造一个也可与检域中的对象。通常有一个 奥姆 在该领域对象侧。这种方法的缺点是,"映射器"往往获得极为复杂,任何的真实情况和可能非常脆弱。

另一个想法提出是为该领域目"包含"的也可与检,因为它只是一个精干的数据的对象。该领域对象的性质将在内部参照的也可与检属性和可能只是回报也可与检如果提出的要求。我可看不出有什么问题这一点,但它感觉是错误的。我已经看到了一些文章里的人使用 它能够 出现了使用这种方法。

是否还有其他的方式?是的方式之一以上的价值使用的?如果是这样,或者如果没有,为什么?

有帮助吗?

解决方案

具有域和您的DTO之间位于映射器的一个好处是不当你只支持单个映射appearent,但由于映射的数量增加,具有代码从域分离有助于保持域简单和精简。你会不会有很多额外的重量塞满你的域名。

就个人而言,我尽量保持映射出我的域名实体,并把责任在我所谓的“管理/服务层”。这是应用程序和程序存储库(IES)之间坐着一个层,并提供业务逻辑,如工作流程协调(如果修改,则可能需要同时修改B上的服务A将与服务B工作)。

如果我有很多可能的结局格式,我可能会考虑创建,可以使用访问者模式,例如改造我的实体可插式格式,但我还没有发现需要却为这种事情复杂。

其他提示

你可以使用一个automapper如 一个由吉米*柏格 它没有连接的对象之间的依赖命名约定得到遵守。

我们使用T4模板来创建映射类。

Pro的 - 人类可读代码可在编译时,比一个运行时映射器更快。在代码100%控制(可以使用部分的方法/模板图案到一个特设的基础上扩展功能)

精读的 - 不包括某些性能,域对象等的集合,学习T4语法

另一种可能的解决方案: http://glue.codeplex.com.

特征:

  • 双向映射
  • 自动测绘
  • 不同类型之间的映射
  • 嵌套映射和展平
  • 列表和数组
  • 关系验证
  • 测试映射
  • 属性、字段和方法

你如何看待实现DTO类,它作为一个参数域对象的内部构造?

说...像这样

class DTO {

     // attributes 

     public DTO (DomainObject domainObject) {
          this.prop = domainObject.getProp();
     }

     // methods
}

您也可以尝试奥蒂斯,对象到对象映射器。概念是类似的NHibernate映射(属性或XML)。

http://code.google.com/p/otis-lib /维基/ GettingStarted

我可以建议一个工具我创建并在CodePlex上托管开源: EntitiesToDTOs

这DTO到实体,反之亦然映射是通过扩展方法来实现,这些组合的每个端部的汇编侧。

您结束与类似的代码:

Foo entity = new Foo();
FooDTO dto = entity.ToDTO();
entity = dto.ToEntity();

List<Foo> entityList = new List<Foo>();
List<FooDTO> dtoList = entityList.ToDTOs();
entityList = dtoList.ToEntities();

为什么不是我们可以这样做?

class UserDTO {
}

class AdminDTO {
}

class DomainObject {

 // attributes
 public DomainObject(DTO dto) {
      this.dto = dto;
 }     

 // methods
 public function isActive() {
      return (this.dto.getStatus() == 'ACTIVE')
 }

 public function isModeratorAdmin() {
      return (this.dto.getAdminRole() == 'moderator')
 }

}


userdto = new UserDTO();
userdto.setStatus('ACTIVE');

obj = new DomainObject(userdto)
if(obj.isActive()) {
   //print active
}

admindto = new AdminDTO();
admindto.setAdminRole('moderator');

obj = new DomainObject(admindto)
if(obj.isModeratorAdmin()) {
   //print some thing
}

<强> @FrederikPrijck (或)某人:请提出。在上面的例子是domainObject的取决于DTO。通过这种办法可以防止代码来执行映射DTO < - >。domainObject的

或domainObject的类可以扩展DTO类?

另一种选择是使用 ModelProjector 。它支持所有可能出现的情况,是很容易以最小的占用空间使用。

我们可以利用厂,纪念品和Builder模式为。工厂隐藏如何从DTO创建域模型的实例的详细信息。记忆碎片会照顾领域模型/从DTO的序列化/反序列化,甚至可以访问私有成员。生成器将允许从映射DTO与连贯接口域。

保持你的实体内的映射逻辑意味着你的域对象是现在知道的“实施细节”的,它并不需要了解。通常,DTO是您通往外部世界(无论是从一个传入请求或经由读从外部服务/数据库)。由于实体是你的业务逻辑的一部分,它可能是最好的,以保持实体之外的那些细节。

保持映射其他地方将是唯一的选择 - 但它应该去哪里?我试过介绍对象映射/服务,但是,一切都后说,做,这似乎是过度设计(也许是)。我已经使用Automapper和这样对于较小的项目,但工具的一些成功像Automapper拿出自己的缺陷。我有一些很难找到相关的映射问题,因为Automapper的映射是隐式的,并从你的代码的其余部分完全解耦(不喜欢“的关注点分离”,但更像是“在什么地方荒凉的映射活”),使他们有时很难追查。不是说Automapper没有用武之地,因为它的作用。我只是觉得映射应该是东西是那么明显和透明,尽量避免的问题。

而不是创建一个映射服务层,我已经有很多成功的让我的DTO的里面我的映射。由于DTO的送花儿给人坐在应用的边界,他们可以意识到的业务对象,并找出如何从/把它们映射。即使当映射的数量扩展到一个合理的数额它的工作原理干净。所有的映射是在一个地方,你不必来管理您的数据层,反腐化层,或表示层的内部一堆地图服务。取而代之的是,映射只是授权给参与该请求/响应的DTO的实现细节。由于串行通常,当你跨网发送,只序列化属性和字段,你应该不会遇到任何问题。就个人而言,我发现这个最干净的选择,我可以说,在我的经验,它很好地扩展在一个大的代码库。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top