如何配置Orika根据上下文将类映射到另一个?

flu*_*nis 6 java orika

我想迁移使用项目dozer来orika.

在推土机中,这是一种常见的做法:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <mapping map-id="all">
        <class-a>com.bnppa.cdj.dto.Source</class-a>
        <class-b>com.bnppa.cdj.dto.Destination</class-b>
        <field>
            <a>id</a>
            <b>id</b>
        </field>
        <field>
            <a>someField</a>
            <b>someField</b>
        </field>
    </mapping>

    <mapping map-id="small">
        <class-a>com.bnppa.cdj.dto.Source</class-a>
        <class-b>com.bnppa.cdj.dto.Destination</class-b>
        <field>
            <a>id</a>
            <b>id</b>
        </field>
    </mapping>
</mappings>
Run Code Online (Sandbox Code Playgroud)

然后在转换对象时使用mapId:

Source s = ...

List<String> mappingFiles = new ArrayList<String>();
mappingFiles.add("dozer/dozerMapping.xml");
mapper = new DozerBeanMapper(mappingFiles);

Destination d = mapper.map(mySource, Destination.class, "small");
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何配置Orika来拥有这样的mapId东西?

在定义我的映射器时,我找不到如何声明map-id:

MapperFactory factory = new DefaultMapperFactory.Builder().build();

//Register a mapper
factory.registerClassMap(factory.classMap(Source.class, Destination.class)
        .field("id","id")
        .field("someField", "someField")
        .toClassMap());
Run Code Online (Sandbox Code Playgroud)

Sid*_*idi 1

快速回答:没有对此功能的内置支持。

但有充分的理由,基本上是因为通常不同的上下文意味着需要创建不同的类(明确定义的责任)。第二点是在对象的深层图中 Orika 重用了类映射的相同定义。因此,上下文可能不依赖于类映射的情况,而是依赖于更大的基础图映射。

当您有超出同一个类的简单“重用”或一些定义明确的场景之外的严肃用例时,我会建议您为每个场景使用专用的 MapperFactory。

例如,当通过 REST API、方法 GET(列表)/ GET(详细信息)/POST/PUT 公开服务时,您可以为每个方法拥有一个专用的映射器。

恕我直言,就实体和 DTO 而言……DTO 是一种为类型化元组命名的契约方式。在上下文中使用同一个类会导致代码中隐藏大量知识。为每个用例指定一个特定的类是迈向良好设计的一步(虽小但很重要)。