AutoMapper官方文档(十七)【配置】

创建一个MapperConfiguration实例并通过构造函数初始化配置:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Foo, Bar>();
    cfg.AddProfile<FooProfile>();
});

MapperConfiguration实例可以静态存储在一个静态字段中,也可以存储在一个依赖注入容器中。 一旦创建,不能更改/修改。

或者,您可以使用静态Mapper实例来初始化AutoMapper

Mapper.Initialize(cfg => {
    cfg.CreateMap<Foo, Bar>();
    cfg.AddProfile<FooProfile>();
});

配置文件实例

组织您的映射配置的一个好方法是使用配置文件。 创建从配置文件继承的类,并将配置放置在构造函数中:

//这是从版本5开始的方法
public class OrganizationProfile : Profile
{
    public OrganizationProfile()
    {
        CreateMap<Foo, FooDto>();
        // 使用CreateMap ...等等。这里(配置文件方法与配置方法相同)
    }
}

// 4.x是如何完成的 - 从5.0开始已经过时了:
// public class OrganizationProfile : Profile
// {
//     protected override void Configure()
//     {
//         CreateMap<Foo, FooDto>();
//     }
// }

在早期版本中,使用配置方法而不是构造函数。 从版本5开始,Configure()已经过时。 它将在6.0中被删除。

配置文件中的配置仅适用于配置文件中的映射。 应用于根配置的配置适用于所有创建的映射。

程序集扫描自动配置

配置文件可以通过多种方式添加到主映射器配置中,可以直接:

cfg.AddProfile<OrganizationProfile>();
cfg.AddProfile(new OrganizationProfile());

或通过自动扫描配置文件:

//扫描程序集中的所有配置文件
//...使用实例方法:
var config = new MapperConfiguration(cfg => {
    cfg.AddProfiles(myAssembly);
});
// ...或静态方法:
Mapper.Initialize(cfg => cfg.AddProfiles(myAssembly));

//也可以使用程序集名称:
Mapper.Initialize(cfg =>
    cfg.AddProfiles(new [] {
        "Foo.UI",
        "Foo.Core"
    });
);

//或程序集的标记类型:
Mapper.Initialize(cfg =>
    cfg.AddProfiles(new [] {
        typeof(HomeController),
        typeof(Entity)
    });
);

AutoMapper将扫描指定的程序集,以继承从配置文件继承的类,并将其添加到配置中。

命名约定

您可以设置源和目标命名约定

Mapper.Initialize(cfg => {
  cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
  cfg.DestinationMemberNamingConvention = new PascalCaseNamingConvention();
});

这会将以下属性映射到对方:property_name -> PropertyName

您也可以在每个配置文件级别进行设置

public class OrganizationProfile : Profile
{
  public OrganizationProfile()
  {
    SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
    DestinationMemberNamingConvention = new PascalCaseNamingConvention();
    //Put your CreateMap... Etc.. here
  }
}

替换字符

您还可以在成员名称匹配期间替换源成员中的单个字符或整个单词:

public class Source
{
    public int Value { get; set; }
    public int Ävíator { get; set; }
    public int SubAirlinaFlight { get; set; }
}
public class Destination
{
    public int Value { get; set; }
    public int Aviator { get; set; }
    public int SubAirlineFlight { get; set; }
}

我们要替换个别字符,也许转换一个单词:

Mapper.Initialize(c =>
{
    c.ReplaceMemberName("Ä", "A");
    c.ReplaceMemberName("í", "i");
    c.ReplaceMemberName("Airlina", "Airline");
});

识别前/后缀

有时你的源/目标属性会有共同的前/后缀,导致你必须做一堆自定义成员映射,因为名称不匹配。 为了解决这个问题,你可以识别前/后缀:

public class Source {
    public int frmValue { get; set; }
    public int frmValue2 { get; set; }
}
public class Dest {
    public int Value { get; set; }
    public int Value2 { get; set; }
}
Mapper.Initialize(cfg => {
    cfg.RecognizePrefixes("frm");
    cfg.CreateMap<Source, Dest>();
});
Mapper.AssertConfigurationIsValid();

默认情况下,AutoMapper可以识别前缀“Get”,如果需要清除前缀:

Mapper.Initialize(cfg => {
    cfg.ClearPrefixes();
    cfg.RecognizePrefixes("tmp");
});

全局属性/字段过滤

默认情况下,AutoMapper尝试映射每个公共属性/字段。 您可以使用属性/字段过滤器过滤出属性/字段:

Mapper.Initialize(cfg =>
{
    //不要映射任何字段
    cfg.ShouldMapField = fi => false;

    // map properties with a public or private getter
    //映射 公共或私有访问器的属性
    cfg.ShouldMapProperty = pi =>
        pi.GetMethod != null && (pi.GetMethod.IsPublic || pi.GetMethod.IsPrivate);
});

配置可见性

默认情况下,AutoMapper只识别公共成员。 它可以映射到私有设置器,但如果整个属性是私人/内部的,则会跳过内部/私有方法和属性。 要指示AutoMapper识别具有其他可见性的成员,请覆盖默认过滤器ShouldMapField和/或ShouldMapProperty

Mapper.Initialize(cfg =>
{
    // map properties with public or internal getters
    cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
    cfg.CreateMap<Source, Destination>();
});

映射配置现在可以识别内部/私人成员。

配置编译

由于表达式编译可能会占用大量资源,因此AutoMapper会在第一个映射上编译类型映射计划。 但是,这种行为并不总是可取的,所以你可以告诉AutoMapper直接编译它的映射:

Mapper.Initialize(cfg => {});
Mapper.Configuration.CompileMappings();

对于几百个映射,这可能需要几秒钟的时间。

重置静态映射配置

静态Mapper.Initialize只能被调用一次。 重置静态映射配置(例如,在测试开始时):

Mapper.Reset();

Mapper.Initialize(cfg => { /* 再次配置 */ });

生产代码中不应该使用重置。 它旨在仅支持测试场景。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AutoMapper是一个用于对象映射的开源库。它可以帮助简化对象之间的转换过程,减少手动编写重复的代码。通过配置映射规则,AutoMapper可以自动将一个对象的属性值复制到另一个对象中对应的属性上,而不需要手动逐个属性进行赋值。 使用AutoMapper,你可以定义映射规则,包括源类型和目标类型以及它们之间的属性映射关系。一旦配置好映射规则,你可以使用简单的API将源对象映射到目标对象上。 以下是一个使用AutoMapper的示例: ```csharp // 定义源类型和目标类型 public class SourceObject { public string Name { get; set; } public int Age { get; set; } } public class DestinationObject { public string Name { get; set; } public int Age { get; set; } } // 配置映射规则 var config = new MapperConfiguration(cfg => { cfg.CreateMap<SourceObject, DestinationObject>(); }); // 创建映射器 var mapper = config.CreateMapper(); // 创建源对象 var source = new SourceObject { Name = "John", Age = 30 }; // 使用映射器进行对象映射 var destination = mapper.Map<SourceObject, DestinationObject>(source); // 输出目标对象属性值 Console.WriteLine(destination.Name); // 输出:John Console.WriteLine(destination.Age); // 输出:30 ``` 通过使用AutoMapper,你可以简化对象之间的映射过程,提高开发效率。它支持各种复杂的映射场景,并且可以通过自定义转换器来处理更复杂的映射逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值