在.NET中使用AutoMapper进行对象映射,对象相互转,简单方便
创始人
2025-07-09 01:30:39
0

AutoMapper是一种对象映射工具,它可以帮助我们将不同类型的数据对象之间进行相互转换。在.NET中,我们可以使用AutoMapper库来简化数据对象之间的映射操作,从而提高代码的可读性和可维护性。

一、AutoMapper的安装和基本使用

1、安装AutoMapper

首先,我们需要在项目中安装AutoMapper库。通过NuGet包管理器,我们可以方便地安装AutoMapper。在Visual Studio中,右键点击项目->管理NuGet程序包->浏览->搜索AutoMapper->安装即可。

2、定义数据模型

假设我们有两个类,一个是Source类,另一个是Destination类。我们希望将Source类的实例映射到Destination类。

public class Source
{
    public int SomeValue { get; set; }
    public string SomeString { get; set; }
}

public class Destination
{
    public int SomeValue { get; set; }
    public string SomeString { get; set; }
}

3、配置AutoMapper映射

我们在应用程序的配置文件(例如appsettings.json)中定义AutoMapper的映射配置。在这种情况下,我们定义了Source类和Destination类之间的映射关系。

{
    "AutoMapper": {
        "Maps": {
            "SourceToDestination": {
                "SomeValue": "SomeValue",
                "SomeString": "SomeString"
            }
        }
    }
}

4、使用AutoMapper进行映射

现在我们可以在代码中使用AutoMapper来将Source对象映射到Destination对象。

IMapper mapper = ConfigurationManager.GetService();
Source source = new Source { SomeValue = 5, SomeString = "Hello" };
Destination destination = mapper.Map(source);

二、AutoMapper的高级应用

1、嵌套对象的映射

如果我们的Source类和Destination类具有嵌套的对象,我们可以使用AutoMapper来处理这些嵌套对象的映射。假设Source类有一个嵌套的Person类,而Destination类有一个嵌套的PersonDTO类,我们可以这样定义映射:

{
    "AutoMapper": {
        "Maps": {
            "SourceToDestination": {
                "SomeValue": "SomeValue",
                "SomeString": "SomeString",
                "Person.Name": "PersonDTO.Name",
                "Person.Age": "PersonDTO.Age"
            }
        }
    }
}

2、使用MapFrom和Condition进行自定义映射规则

有时候我们可能需要在映射过程中应用一些自定义的映射规则。AutoMapper提供了MapFrom和Condition关键字,可以让我们在映射过程中应用自定义的规则。例如,假设我们在映射Source类到Destination类时,希望将Source类的SomeString属性转换为大写,我们可以这样定义映射规则:

{
    "AutoMapper": {
        "Maps": {
            "SourceToDestination": {
                "SomeValue": "SomeValue",
                "SomeString": { 
                    "MapFrom": "ConvertToUpper", 
                    "Condition": "it.SomeString != null" 
                }
            }
        }
    },
    "AutoMapperExternals": {
        "Converts": [ { "Type": "System.String", "ConvertUsing": "ConvertToUpper" } ]
    }
}

其中,在代码中我们需要定义一个ConvertToUpper方法来将字符串转换为大写。

public class StringConverter : ITypeConverter
{
    public string Convert(ResolutionContext context) => context.SourceValue.ToUpper();
}

3、映射继承属性

如果你有一个基类或接口,并且你想将该基类或接口的派生类映射到另一个对象,那么你可以使用AutoMapper的继承映射功能。你只需要在映射配置中指定基类和派生类之间的映射关系。

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
}

// 在映射配置中指定继承映射关系
cfg.CreateMap();

4、使用IgnoreMember和IncludeMember

有时候你可能会遇到一些不需要映射的属性,或者只希望映射对象的一部分属性。这时,你可以使用IgnoreMember和IncludeMember来控制映射过程。

// 忽略Source对象的某些属性
cfg.CreateMap().ForMember(dest => dest.IgnoredProperty, opt => opt.Ignore());

// 只映射Source对象的某些属性
cfg.CreateMap().ForMember(dest => dest.IncludedProperty, opt => opt.Include("SomeProperty"));

5、使用MapFrom和Condition

MapFrom和Condition可以让你在映射过程中执行更复杂的逻辑。比如,你可以使用MapFrom指定一个方法来确定目标属性的值,或者使用Condition来控制映射的条件。

// 使用MapFrom指定一个方法来确定目标属性的值
cfg.CreateMap().ForMember(dest => dest.ComputedProperty, opt => opt.MapFrom(src => CalculateValue(src)));

// 使用Condition来控制映射的条件
cfg.CreateMap().ForMember(dest => dest.ConditionalProperty, opt => opt.Condition(src => src.SomeProperty != null));

6、自定义分辨率器

有时候你可能会需要在映射过程中使用自定义的分辨率器。你可以实现AutoMapper的IValueResolver接口,并实现自己的分辨率逻辑。

public class CustomResolver : IValueResolver
{
    public string Resolve(Source source, Destination destination, string member, IMappingExpression mapping)
    {
        // 实现自己的分辨率逻辑
        return ResolveValue(source);
    }
}

// 在映射配置中使用自定义分辨率器
cfg.CreateMap().ForMember(dest => dest.Property, opt => opt.ResolveUsing());

这些是AutoMapper的一些高级应用,可以帮助你更灵活地处理对象映射的各种情况。通过合理的配置和扩展AutoMapper,可以简化代码并提高开发效率。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...