VCommon:基础程序集

作者:V君 发布于:2018-8-5 18:49 Sunday 分类:VCommon

此程序集作为通用应用程序基础类库(VCommon)的基础, 类库中其他程序集均引用本程序集.

提供了许多可用于偷懒的捷径扩展方法以及对.NET Framework做扩充, 不依赖第三方库.

 

源代码:SVN,

 

命名空间 定义基础数据类型扩展方法和不便归类的实用类


 BitAccessor 二进制位存取扩展方法

  为有无符号 byte,short,int,long 分别提供一个名为Bit的扩展方法

  使用起来和JQuery的手感相似


 DateTimeExtensionMethod 日期时间扩展方法

  GetBetweenMonths 收集两个DateTime值之间经过的月份 


 EnumExtensionMethod 枚举值扩展方法

  GetFlags 分解一个组合Flag枚举值


 StringExtensionMethod 字符串扩展方法,基本上就只是些捷径

  JoinString 使js中数组的join能在C#中使用默认不设分隔符

  IsNullOrEmpty / IsNullOrWhiteSpace 用来偷懒的扩展方法


 TimeSpanFormatter 时间间隔字符串格式化扩展

   ToReadableString TimeSpan扩展方法

    传入一个组合Flag枚举值决定需要格式化输出的部分;

    另外一bool参数决定是否显示值为0的部分,默认不显示.目前并没有实现多语言支持.


 LazyHolder<T> 线程安全惰性初始化放置类

  将实例创建提供者作为Func从构造传入,对外暴露Instance只读实例属性.

  该属性首次被访问时调用实例提供者Func, 获取到实例之后放置到私有字段供后续使用.


 VCommonException 类库异常基类

 ParamsFunc 可变参数的Func, 与系统类库自带的Func不兼容.


命名空间 VCommon.Collections 自定义集合和为系统内置集合提供操作捷径扩展方法


 ReadOnlyHashset<T> 只读哈希集

  对现有系统HashSet进行封装, 为不可变类型提供基础.

  实现了隐式转换, 可直接传入系统HashSet.


 ShortcutExtensionMethod 捷径扩展方法

  从SQL的In/Not In学来的姿势,为全部对象提供扩展方法,使代码更符合语义

  具体实现调用Linq的Contains. 不要和查询表达式混淆!


 CollectionExtensionMethod 集合扩展方法

  IsNullOrEmpty 用来偷懒捷径,和字符串的类似,检查集合是否为空或者元素是否为0个.


 EnumerableExtensionMethod IEnumerable扩展方法

  WrapEnumerable 针对EF动态过滤,数组参数会导致非预期结果,需要对数组调用这个方法.

  Stack / StackSequence 为连续序列的整理提供基础实现,如:过滤连续重复元素.

  ToHashSet 用来偷懒的捷径,直接调用HashSet构造,传入被扩展的IEnumerable<T>对象

  ToConcurrentDictionary 和上者差不多,参入一些逻辑来构建并发字典


命名空间 VCommon.DataModel 通用数据模型定义或辅助操作


 TreeCopy 树状数据结构拷贝/变换操作基础实现

  可以对相同或不同的树状数据结构进行拷贝, 按传入的结构变换回调执行递归.


命名空间 VCommon.Diagnostics 诊断相关辅助类


 TimingMeasure 基于内置Stopwatch实现执行耗时测量基础实现

  实现了IDispose接口,可以方便地写成using语句块

  提供通过构造传入回调的实现,当执行离开using语句块时可以接收测量出来的时间


 RetryPolicy 实现对action/func调用异常处理重试策略

  可分别指定重试次数和间隔时间,每次尝试的前,后,失败都可以通过回调感知.

  失败的回调提供重试的次数以及发生的异常,返回bool决定是否继续尝试.

  如果超过重试次数,抛出AggregateException带出所有发生的异常.


 StackTraceExtensionMethod 为内置的StackTrace提供扩展方法

  GetFormattedDetailStackTraceText 

   格式化每个堆栈帧带出程序集名称,可指定一个Type来截断内容.

   用作记录打日志的位置十分合适.


命名空间 VCommon.IO内置IO功能扩展


 TempFile 实现了IDispose接口的临时文件封装,提供只读属性获取临时文件路径.

  适用于不方便流式操作的场合.如调用外部命令行应用程序时.

  封装了临时创建删除的过程,可写成using语句块让代码更加结构化.

  构造时调用Path.GetTempFileName获取临时文件,并在using语句块离开之后删除.

  确保using语句块离开之前关闭文件.删不掉报错我不背锅!


 PathExtensionMethod 路径操作扩展

  CombinePath 字符串供扩展方法,用指定的分隔符连接字符串,达到路径连接的目的

   可在第二个参数指定使用系统默认分隔符或正斜杠“/”

   未做非法字符检查以及“..”简化

  CombineWebPath 实为上个扩展方法的重载,将第二个参数固定为false


 StreamExtensionMethod 流操作扩展

  ReadFully 从流中读取全部内容并以字节数组返回 (by大神 Jon Skeet )


命名空间 VCommon.Linq.Expression.Predicate 查询表达式树构建

 可以非常灵活的进行动态条件查询.


 Internals/PredicateConcater 拼接表达式的具体实现,网上流传的PredicateBuilder

  具体实现有点晦涩还和下面重名就藏到内部去了,封装成下面简单易用的写法.


 PredicateWrap 实现了逻辑操作符重载支持的查询表达式封装类

  提供查询表达式隐式转换和 &、| 操作符重载.

  具体实现使用上者进行表达式拼接, 兼容null传参, 表示啥也不做(不参与过滤).


 PredicateBuilder 提供了常用查询条件操作符表达式生成

  可以轻松生成上者的实例, 兼容null传参.

  目前提供了多种常用操作符,例如like、between、in、=、<、>等.

  本类被定义成泛型单例,目的是为了方便实现扩展方法,用在应用程序框架十分方便.

 

命名空间 VCommon.Logging 定义日志类接口以及具体实现实例放置


 Logger 打日志的入口

  内部Hold住一个ILogger实例,通过Init方法传递进去.

  定义为静态类,静态方法调用Hold住的ILogger,可以在任意位置调用.


 ILogger 日志记录器接口定义,提供了6个级别


 DefaultLoggerILogger的伪实现,内部调用Logger的静态方法

  针对不方便调用静态方法的情形(目前似乎没有)

  会导致无限递归因此不能用作Logger.Init参数,已做传参校验.


 MultiLogger 多目标Tee实现,实现ILogger接口,例如输出到控制台的同时也写入到文件

  通过构造把多个ILogger实例传入到内部Hold住,在每个ILogger实现方法里循环调用.  


 NullLogger 什么都不做的空实现,如果连控制台都不想输出,就用这货的实例来初始化吧!

  作为构造参数传入MultiLogger会被忽略


 TextLogPool 文本日志池,零散多文件线程安全写入,实现IDispose接口

  适用于为多个数据来源分别写入文件的情形,做了线程安全控制,异步并发调用也支持.

  内部自主维护多个FileStream实例,在超过指定闲置时间并没有操作会自动将其关闭.

  使用者只需要调用 AppendText(string path,string content):bool

  具体实现会先去检查路径对应实例是否已创建,若已创建则拿出来用,否则创建一个.

  不会抛异常.返回值告诉你有没有写入成功,若不成功会把错误详情和内容一起写到警告日志.

  

命名空间 VCommon.Reflection 定义反射、特性辅助类和扩展方法


 AttributeExtensionMethod 为确认及寻找特性提供扩展方法

  针对.NET里面的特性反射不包括接口,就扩展了一下.

  并不是给特性加扩展,而是给需要找特性的类,命名有点反过来


 DynamicMemberAccess 顾名思义就是动态成员访问

  通过泛型参数给定要访问的类以及返回值类型,以及构造参数传入成员名

  就可以读取静态或实例成员(属性或字段)的值, 具体实现使用了表达式编译.


 EnumBind/EnumBindAttribute 提供枚举值与类型定义的绑定特性

  提供枚举值和类定义双向查找.

  可用在基类定义枚举字段,按值区分子类的情形,如json类型自动绑定到子类


 EnumMeta/EnumMetaAttribute 上者类似的实现,和Description用法类似

  可用于控制枚举提供给界面显示的内容.


 TypeExtensionMethod 为Type提供一些扩展方法

  GetPublicInstanceProperties/GetPublicInstanceFields/GetPublicInstanceMethods

   这三者从名称就能看出来是干啥用的. ((′?((☆ミつ

  FilterInterfaces 这要重点讲一讲

   首先获取被扩展Type对象的全部接口, 然后按照传参进来的接口定义逐个进行匹配,

   若接口是泛型则取其泛型定义来匹配,否则直接匹配.

   将匹配结果以字典的方式返回,另外用out吐出未匹配的接口

   在按接口自动注入容器时很好用


 TypeFinder 从ABP仿来的实现

  初始化时从当前应用程序域中检索全部程序集,并逐个检索全部类定义并装入集合.

  在需要遍历查找时就不用再爬一边全部程序集了.


命名空间 VCommon.Security 定义安全相关辅助类


 RandomStringGenerator 随机字符串生成器

  GuidBasedRandomHexString64 基于GUID夹杂密码学随机数生成器凑出64位十六进制字符串

   用作身份验证Token


标签: 软件开发 C# .NET

引用地址:

发表评论:

Powered by emlog 去你妹的备案 sitemap