01.AutoMapper 之约定(Conventions)

约定(Conventions)

条件对象映射器

条件对象映射器根据源类型和目标类型之间的条件生成新类型映射。

var config = new MapperConfiguration(cfg => {
    cfg.AddConditionalObjectMapper().Where((s, d) => s.Name == d.Name + "Dto");
});

成员配置

成员配置与配置类似,但您可以完全控制已使用和未使用的内容。

var config = new MapperConfiguration(cfg => { cfg.AddMemberConfiguration(); });

AddMemberConfiguration() 以空配置开始。 所有适用的配置都将失效。

命名约定

AddMemberConfiguration().AddMember<NameSplitMember>() 获取默认的命名约定功能。

可以通过将lambda传递给参数来覆盖源和目标成员命名约定。 SourceExtentionMethods也可以在这里设置。

如果您没有设置任何内容,AutoMapper将使用DefaultMember,它只会使用属性的名称进行检查。

PS:如果不设置这个,扁平化的对象映射将被禁用。

替换字符

AddMemberConfiguration().AddName<ReplaceName>(_ => _.AddReplace("Ä", "A").AddReplace("í", "i"));

识别前/后缀

AddMemberConfiguration().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get", "get").AddStrings(p => p.DestinationPostfixes, "Set"));

属性支持

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>();* 目前始终支持

查找 属性/字段 的 SourceToDestinationMapperAttribute 实例,并调用用户定义的isMatch函数来查找成员匹配项。

MapToAttribute是其中之一,它将根据提供的名称匹配属性。

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

AutoMapper Getting 的默认值

AddMemberConfiguration().AddMember<NameSplitMember>().AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes, "Get"))

如果不使用AddMemberConfiguration(),则由Configuration设置默认值。

扩展能力

每个AddNameAddMember类型都基于接口ISourceToDestinationNameMapperIChildMemberConfiguration。 您可以通过继承接口创建自己的类,通过lambda语句参数配置其属性,这样您就可以对AutoMapper如何解析属性映射进行微调。

多种配置

每个配置都是它自己的一套规则,所有这些规则都必须通过才能说明属性已映射。如果进行多种配置,则它们彼此完全分离。

配置文件(Profiles)

这些可以添加到Profile以及ConfigurationStore。

每个Profiles规则彼此分开,不会共享任何条件。如果从一个ProfileAddConditionalObjectMapper生成映射,则只能使用该'Profile'的AddMemberConfigurations来解析属性映射。

例子

下面显示的是两个Profile,用于制定与数据传输对象(Data Transfer Object)之间传输的约定。 每个都被一种映射方式隔离 并且都明确规定了规则。

// 使用NameSplitMember规则进行对象扁平化
// 仅适用于具有相同名称且目标类型以Dto结尾的
// 仅适用于源属性后缀为Dto的
public class ToDTO : Profile
{
    protected override void Configure()
    {
        AddMemberConfiguration()
        .AddMember<NameSplitMember>()
        .AddName<PrePostfixName>(
                _ => _.AddStrings(p => p.Postfixes, "Dto"));
        AddConditionalObjectMapper().Where((s, d) => s.Name == d.Name + "Dto");
    }
}

// 不扁平化对象
// 仅适用于具有相同名称且源类型以Dto结尾的
// 仅适用于目标属性后缀为Dto的
public class FromDTO : Profile
{
    protected override void Configure()
    {
        AddMemberConfiguration().AddName<PrePostfixName>(
                _ => _.AddStrings(p => p.DestinationPostfixes, "Dto"));
        AddConditionalObjectMapper().Where((s, d) => d.Name == s.Name + "Dto");
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 10,397评论 0 1
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,463评论 0 5
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 简书 24. Externalized Co...
    SnailTyan阅读 6,240评论 1 2
  • #清凉法语#快乐源于知足 两个人非常渴,喝同一口水时,一个用黄金杯,一个用陶土杯。前者觉得自己富贵,后者认为自己贫...
    xcy无名阅读 2,256评论 0 0
  • 还是慢下来好好学习更舒服更轻松更愉悦更有利更有意义一点。 来到学校,我觉得自己能更加容易改变自己,家里真的是一个舒...
    Moon_star阅读 3,025评论 0 0

友情链接更多精彩内容