美文网首页dotNET.NET
01.AutoMapper 之约定(Conventions)

01.AutoMapper 之约定(Conventions)

作者: 做人生的CEO | 来源:发表于2018-12-30 10:49 被阅读1次

    约定(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");
        }
    }
    

    相关文章

      网友评论

        本文标题:01.AutoMapper 之约定(Conventions)

        本文链接:https://www.haomeiwen.com/subject/zswulqtx.html