WeihanLi.Npoi 1.18.0 Released

WeihanLi.Npoi 1.18.0 Released

Intro

前段时间一直在想,把现在的配置做成类似于 AutoMapperFluentValidation 那样,把每个类型的 mapping 配置放在一个类中,这样我们就可以比较好地组织我们的 mapping 关系,也可以配置多个 mapping,动态地进行切换,于是就想着今天实现这个 feature。

Sample

在 1.18.0 版本中会加入一个 IMappingProfile<TEntity> 的接口,要使用 fluent API 方式自定义 mapping 关系的时候可以实现这个接口,这个接口的定义非常的简单,定义如下:

public interface IMappingProfile
{
}public interface IMappingProfile<T>
{public void Configure(IExcelConfiguration<T> configuration);
}

这里增加了一个非泛型的接口,实际使用主要是使用泛型接口,非泛型的接口目前是一个空接口,用来过滤不符合条件的类型。

使用的示例如下:

public class NoticeProfile: IMappingProfile<Notice>
{public void Configure(IExcelConfiguration<Notice> noticeSetting){noticeSetting.HasAuthor("WeihanLi").HasTitle("WeihanLi.Npoi test").HasSheetSetting(setting =>{setting.SheetName = "NoticeList";setting.AutoColumnWidthEnabled = true;});noticeSetting.Property(_ => _.Id).HasColumnIndex(0);noticeSetting.Property(_ => _.Title).HasColumnIndex(1);noticeSetting.Property(_ => _.Content).HasColumnIndex(2);noticeSetting.Property(_ => _.Publisher).HasColumnIndex(3);noticeSetting.Property(_ => _.PublishedAt).HasColumnIndex(4).HasColumnOutputFormatter(x => x.ToStandardTimeString());}
}

在注册 IMappingProfile 的时候我们可以通过指定 Type 和程序集扫描两种方式来注册,Type 注册可以获取类型的可访问性,只要能够编译通过就能注册成功,程序集扫描只扫描 public 的类型成员,可以根据需要自行选择:

void LoadMappingProfiles(params Assembly[] assemblies);
void LoadMappingProfiles(params Type[] types);

使用示例如下:

// Load by type
FluentSettings.LoadMappingProfiles(typeof(NoticeProfile));
// Load by assembly
FluentSettings.LoadMappingProfiles(typeof(NoticeProfile).Assembly);

What's Inside

实现方式比较简单,通过扫描程序集或加载指定类型,通过反射创建一个 mapping profile 实例并注册 mapping 关系。

foreach (var type in types.Where(x => x.IsAssignableTo<IMappingProfile>()))
{var profileInterfaceType = type.GetImplementedInterfaces().FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == s_profileGenericTypeDefinition);if (profileInterfaceType is null){continue;}var profile = Activator.CreateInstance(type);var entityType = profileInterfaceType.GetGenericArguments()[0];var configuration = InternalHelper.GetExcelConfigurationMapping(entityType);var method = profileInterfaceType.GetMethod(MappingProfileConfigureMethodName,new[] {typeof(IExcelConfiguration<>).MakeGenericType(entityType)});method?.Invoke(profile, new object[] {configuration});
}

More

具体使用可以参考项目单元测试和另外一个示例项目:https://github.com/OpenReservation/ReservationServer

利用 Source Generator 我们可以进一步的将反射的这一过程进行优化,在编译时生成强类型的注册代码,这样也可以进一步地优化注册性能,不过考虑实际注册的时候一般只会执行一次,而且目前 VS、Rider 对 Source Generator 的支持不是特别好,也就暂时没考虑使用 Source Generator 的方式来做,后面可以再做优化

希望能够通过这样的功能把 mapping 关系的配置更好的组织起来,如果使用时有遇到问题或者觉得需要改进的,欢迎通过项目 issue 反馈

References

  • https://github.com/WeihanLi/WeihanLi.Npoi

  • https://github.com/OpenReservation/ReservationServer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表格高亮

引用&#xff1a;http://blog.163.com/ms8712126/blog/static/1899099120122934023200/ //js实现隔行变色window.οnlοadfunction(){var otaldocument.getElementById("otable");for(var i0; i<otal.rows.length; i){ if(i%20){ otal.rows[i].className"e…

大数据人工智能时代,这个行业终于爆发了!

全世界只有3.14 % 的人关注了数据与算法之美这个冬天的程序员可谓是受到了心理和生理上的双重折磨&#xff0c;不仅天气冷&#xff0c;寒冬还见了鬼一样的笼罩着互联网&#xff01;正如老话所说&#xff0c;哪有稳定的工作&#xff0c;只有稳定的能力。这个冬天上午还在改bug下…

Java连续获取两个输入,java 获取控制台的输入的两个方法

链接里面写了两种http://blog.csdn.net/songylwq/article/details/7714622第三种&#xff1a;public class GcdLcm{public static void main(String []args){if(args.length<2){System.out.println("Please input two number...");System.exit(0);}int mInteger.p…

弃码而去

题图来自溪源2017年拍摄的照片。弃码而去1那是2015年的一天。下午5点40&#xff0c;我收拾完手头上的工作&#xff0c;准备关机回家时&#xff0c;qq上突然弹出的窗口吸引了我的注意。“源哥&#xff0c;我能跟你聊一下么&#xff1f;”我点开一看&#xff0c;发现给我发消息的…

Linux虚拟文件系统(VFS)

文件系统是操作系统里非常重要的一个子系统。虚拟文件系统&#xff0c;顾名思义。它为应用程序员提供一层抽象&#xff0c;屏蔽底层各种文件系统的差异。Linux的文件系统采用面向对象的方式设计&#xff0c;这使得Linux的文件系统非常容易扩展&#xff0c;我们可以非常容易将一…

config.php开启redis,微擎如何开启redis,redis开启方法详解

资源来源网络&#xff0c;如果需要授权&#xff0c;请大家更换源码&#xff0c;模块仅供学习&#xff0c;如需商用请购买正版授权&#xff0c;本栏目不提供技术服务&#xff0c;积分不够请签到&#xff0c;或者会员中心投稿源码一、使用5G云宝塔定制版的很多问微信怎么开启redi…

对不起,你被裁了

全世界只有3.14 % 的人关注了数据与算法之美在这互联网高速发展的时代新词层出不穷不过说到造词能力中国肯定是当仁不让的就连裁员这件事都能玩出花来今天数据汪就给大家普普及一下那些关于“裁员”的黑话美团美团外卖&#xff0c;裁员真快不久前&#xff0c;有美团员工在脉脉上…

c#爬虫-使用ChromeDriver 所见即所得

问题最近在做爬虫的时候发现很多网页都是浏览器看得见&#xff0c;但是源文件是看不到的&#xff0c;也就是所谓的异步加载。这时候如果我们需要那些异步内容&#xff0c;要么是了解他的规则&#xff0c;进行条件的组合进而再次进行http请求&#xff0c;得到数据&#xff1b;这…

使用Ext.grid.Panel显示远程数据

使用Ext.grid.Panel显示远程数据 对于Ext.grid.Panel而言&#xff0c;它只是负责显示Store数组中心的数据&#xff0c;至于Store保存的数据到底是浏览器本地数据&#xff0c;还是远程服务器的数据&#xff0c;Ext.grid.Panel并不关心。因此&#xff0c;使用Ext.grid.Panel显示远…

4-8岁那些最难的数学概念,美国老师用一套绘本让孩子秒懂

▲数据汪特别推荐点击上图进入玩酷屋在美国&#xff0c;有不少数学故事类的绘本&#xff0c;小木今天推荐的这套《Math is categorical》就经常被美国老师用于课堂的教学&#xff0c;亚马逊的评价也是接近5星的好评。下面这个5星评价就是来自于一位美国老师&#xff0c;她就说学…

php cbd架构,CBD模式

# CBD模式[上一页](# "上一页")[下一页](# "下一页")ThinkPHP从3.0版本开始引入了全新的**CBD(核心Core行为Behavior驱动Driver)**架构模式&#xff0c;因为从底层开始&#xff0c;框架就采用核心行为驱动的架构体系&#xff0c;核心保留了最关键的部分&am…

WPF 读取Docx文件并显示(附下载链接)

在wpf中直接显示Docx文件 &#xff0c;直接看看效果吧&#xff1a;下面直接看代码&#xff0c;添加主要有两个类&#xff1a;DocxReader类&#xff1a;using System; using System.IO; using System.IO.Packaging; using System.Xml;namespace WpfEmbeddedDocx {class DocxRead…

找回创新能力 才是苹果的救命稻草

在过去的很多年里&#xff0c;苹果就是创新的代名词。iPod、iPhone以及iPad等&#xff0c;苹果的每一件产品都闪耀着巨大的创新魅力&#xff0c;人们可以不吃饭、不睡觉、半夜排队只为拥有一款苹果的最新产品&#xff0c;创新让苹果风靡世界。 但如今iPhone 5的上市&#xff0c…

php 覆盖相同键的值,php - PHP数组使用相同的字符串键组合值 - SO中文参考 - www.soinside.com...

我有以下常见问题&#xff0c;但无法确定哪种数组函数可能适用于以下格式&#xff1a;((已尝试array_merge&#xff0c;array_merge_recursive&#xff0c;array_combine&#xff0c;array_splice&#xff0c;但未按预期工作。)Array([0] > Array([r_id] > 11[r_sid] >…

李国庆离开当当,广东消委会告长隆,智能校服提供定位功能,全球首个5G火车站来了,这就是今天的大新闻...

今天是2月21日农历正月十七今天下雨 出门忘带雨伞但是心情还是美丽的因为我没被淋湿下面是今天的大新闻李国庆宣布离开一手创办的当当 &#xff08;界面新闻&#xff09;2月20日上午&#xff0c;当当联合创始人李国庆正式宣布&#xff0c;将离开自己一手创办并为之奋斗19年的…

Source Generators(源代码生成器)的调试器支持 | Visual Studio 2019(16.10)新功能试用...

开始之前Source Generators旨在启用编译时间元编程&#xff0c;即可以在编译时间创建并添加到编译中的代码。首先用一个Demo为不了解Source Generators的朋友演示一下功能。Source Generators详细说明请参看Source Generators Cookbook[1]创建一个ClassLibrary1项目&#xff08…

[收藏]REST -维基百科

表征状态转移&#xff08;英文&#xff1a;Representational State Transfer&#xff0c;简称REST&#xff09;是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。 目前在三种主流的Web服务实现方案中&#xff0c;因为REST模式的Web服务与复杂的SOAP和XML-RP…

程序猿专属成语 get√

全世界只有3.14 % 的人关注了数据与算法之美成语简直是中华文化底蕴一大精华&#xff0c;当程序员和成语联系上了&#xff0c;就有了下面这些火的不行的新兴成语。你还知道哪些关于程序猿的成语&#xff0c;欢迎留言分享。版权归原作者所有&#xff0c;转载仅供学习使用&#x…

哼!看你能坚持多久

21在行为心理学中&#xff0c;人们把一个人的新习惯或理念的形成并得以巩固至少需要21天的现象&#xff0c;称之为21天效应。今天一数&#xff0c;好巧&#xff01;居然我的公众号已经连续发布了21天&#xff08;本文是第22天&#xff09;。仅以此文记录第21天&#xff0c;与大…

.NET 6 新特性 Parallel ForEachAsync

.NET 6 新特性 Parallel ForEachAsyncIntro在 .NET 6 中有一个 API Parallel.ForEachAsync 在官方的博客中一直被忽略&#xff0c;但是我觉得这个 API 非常的实用&#xff0c;类似于同步版本的 Parallel.ForEach&#xff0c;可以比较高效地控制多个异步任务的并行度。之前的版本…