首页 后端开发 C#.Net教程 C#中关于AutoMapper应用的实例

C#中关于AutoMapper应用的实例

May 15, 2018 am 11:37 AM
.net

最近发现了一个比较有趣的东西 AutoMapper,主要将Model转换为DTO,DTO更注重数据,对领域对象进行合理封装,从而不会将领域对象的行为过分暴露给表现层。

先来看一点实例,两个类之前的映射。

首先定义两个类Source与DTOSource:

public class Source
    {
        public int Id { get; set; }
        public string Content { get; set; }
    }

    public class DTOSource
    {
        public int Id { get; set; }
        public string Content { get; set; }
    }
登录后复制

Source与DTOSource字段完全相同,来看看它俩如何通过AutoMapper转换,代码很简单。

Mapper.Initialize(x=>{
     x.CreateMap<Source,DTOSource>();
});

Source s = new Source{Id=1,Content="123"};

DTOSource dto = Mapper.Map<DTOSource>(s);
登录后复制

第一步建立Source到DTOSource之间的映射,初始化一个Source实例后,来看下执行结果:

执行完成后,可以看到dto中的数据与之前初始化的s的数据是一样的,就像是直接将s拷贝了一份给dto,在两个类字段名定全相同的情况下如此,那么如果DTOSource中的字段名与Source中的不相同如何,其实也很简单,只需

要改成一点点的代码既可:

我们将DTOSource中的Content的字段名改成Desc,此时只需要建立映射关系时,指定字段就可以了:

1 Mapper.Initialize(x => {
2    x.CreateMap<Source, DTOSource>().ForMember(c=>c.Desc,q=> {
3       q.MapFrom(z => z.Content);
4      });
5 });
登录后复制

来看看运行结果如何;

可以看到与之前的运行结果是相同的。

那么如何映射两个List,其实也很简单,和上述代码几乎可以说是无差别,只是在最后一步时,要做一点点的修改就可以了。如下面代码:

Mapper.Initialize(x => {
                x.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q =>
                {
                    q.MapFrom(z => z.Content);
                });
            });

            s.Add(new Source { Id = 1, Content = "123" });

            var dto = Mapper.Map<List<DTOSource>>(s);
登录后复制

可以看到除了最后一句代码,其它几乎是完全相同的,只是在最后一句代码中,目标类型改成了List仅此而已。看下运行结果如何:

结果符合预期。

在实际的项目中,这样的写法肯定是不符合要求的,一般会做一个封装,新建一个SourceProfile继承自Profile:

1  public SourceProfile()
2         {
3             base.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => {
4                 q.MapFrom(z => z.Content);
5             });
6         }
登录后复制

所有映射关系都可以写在这一个类里,只需要在程序初始化的时候调用一次就可以了:

 
1
 Mapper.Initialize(x =>{  x.AddProfile<SourceProfile>(); });
登录后复制

博主使用的AutoMapper版本6.1.1.0,因为AutoMapper在6.0版本时移除了Profile中的Configure,所以与6.0版本以下写法有点不同,6.0以下版本写法为:

public class SourceProfile : Profile
    {
        protected override void Configure()
        {
            CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => {
                q.MapFrom(z => z.Content);
            });
        }
    }
登录后复制

继承Profile重写其Configure即可,调用方式与上述没有太大差别。 Mapper.Initialize中可添加一个或多个Profile。

在MVC项目的应用中,可以将Mapper.Initialize封装到一个类里;

 public static class AutoMapperForMvc
    {        public  static void Register()
        {
            Mapper.Initialize(x => {
                x.AddProfile<SourceProfile>();
            });
        }

    }
登录后复制

进而在MVC的Global中进一次性注册:

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //注册
            AutoMapperForMvc.Register();
        }
    }
登录后复制

以上是C#中关于AutoMapper应用的实例的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C#的就业前景如何 C#的就业前景如何 Oct 19, 2023 am 11:02 AM

无论您是初学者还是有经验的专业人士,掌握C#将为您的职业发展铺平道路。

分享几个.NET开源的AI和LLM相关项目框架 分享几个.NET开源的AI和LLM相关项目框架 May 06, 2024 pm 04:43 PM

当今人工智能(AI)技术的发展如火如荼,它们在各个领域都展现出了巨大的潜力和影响力。今天大姚给大家分享4个.NET开源的AI模型LLM相关的项目框架,希望能为大家提供一些参考。https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一种开源的软件开发工具包(SDK),旨在将大型语言模型(LLM)如OpenAI、Azure

面向开发人员的.NET性能优化技术 面向开发人员的.NET性能优化技术 Sep 12, 2023 am 10:43 AM

如果你是一名.NET开发者,你必须意识到在交付高质量软件方面,优化功能和性能的重要性。通过熟练使用提供的资源并减少网站加载时间,你不仅为用户创造了愉快的体验,还能减少基础设施成本。

Java框架和.NET框架的性能差异 Java框架和.NET框架的性能差异 Jun 03, 2024 am 09:19 AM

在高并发请求处理方面,.NETASP.NETCoreWebAPI性能优于JavaSpringMVC,原因包括:AOT提前编译,减少启动时间;更精细的内存管理,由开发人员负责分配和释放对象内存。

C#.NET面试问题和答案:提高您的专业知识 C#.NET面试问题和答案:提高您的专业知识 Apr 07, 2025 am 12:01 AM

C#.NET面试问题和答案包括基础知识、核心概念和高级用法。1)基础知识:C#是微软开发的面向对象语言,主要用于.NET框架。2)核心概念:委托和事件允许动态绑定方法,LINQ提供强大查询功能。3)高级用法:异步编程提高响应性,表达式树用于动态代码构建。

高级C#.NET教程:ACE您的下一次高级开发人员面试 高级C#.NET教程:ACE您的下一次高级开发人员面试 Apr 08, 2025 am 12:06 AM

C#高级开发者面试需要掌握异步编程、LINQ、.NET框架内部工作原理等核心知识。1.异步编程通过async和await简化操作,提升应用响应性。2.LINQ以SQL风格操作数据,需注意性能。3..NET框架的CLR管理内存,垃圾回收需谨慎使用。

C#.NET:探索核心概念和编程基础知识 C#.NET:探索核心概念和编程基础知识 Apr 10, 2025 am 09:32 AM

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。

.NET中的C#代码:探索编程过程 .NET中的C#代码:探索编程过程 Apr 12, 2025 am 12:02 AM

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

See all articles