Asp.net 面向接口可扩展框架之类型转化基础服务

新框架正在逐步完善,可喜可贺的是基础服务部分初具备模样了,给大家分享一下

由于基础服务涉及太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块

说到类型转化必须要清楚.net的类型,类型都不清楚何来类型转化

1、Primitive类型

1.1 这个概念估计很多人都没听说过,Primitive不是一个新类型,而是.net类型中最基本的一种分类,是基元类型的意思

        MS将类型分为三类:Primitive(基元类型)、Complex(复合类型) 和 Collection(集合类型),Type 提供了IsPrimitive 属性

1.2 哪些类型属于Primitive呢?

参考链接:http://msdn.microsoft.com/en-us/library/system.type.isprimitive(v=vs.110).aspx

”The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single.“

1.3 看到这里还是挺失望的,我们常用的类型Decimal和String并不含在内

有的同学可能说,别说那两个了,里面就除了Char和Double其他都没用过;老实说MS真的把.net程序员彻底惯坏了

其实Boolean就是我们常用的bool,Int32就是int,Int64就是long,Single就是float

   

1.4 Primitive类型有什么用呢?

Primitive是基元类型,可以这样理解其他类型都是由Primitive类型构成的或者衍生的,.net对Primitive支持最好,有些地方对于非Primitive类型支持不好,可能造成"灵异"事件

   这里就不展开说明Primitive类型

2、IConvertible类型

  IConvertible不是新维度的类型类别,IConvertible是MS定义的一个接口,我这里讲的IConvertible类型特指Ms定义的基本类型中继承了该接口的类型

  我来稍作解析一下,继承了IConvertible的类型非常强大,可以方便的转化类常用的15种类型,也正是这15种类型继承了IConvertible接口

  IConvertible类型转化为其他类型(以上15种),也就是这15种类型可以方便的相互转化(其实不一定的,有些转化是会出错的)

IConvertible类型转化具有高度的扩展性,可以传一个格式化的参数(IFormatProvider)

3、"基本"类型

这里是我定义的”基本类型“,我认为有这些类型就足够开发使用,框架对次之外的类型不予"支持",或者优先支持

包含类型列表:bool、byte、char、decimal、double、float、int、long、string、DateTime、byte[]

注1:在现在内存这么便宜的时代,我认为短数据类型的作用不大,短数据类型都使用int就好了

注2:我也不喜欢使用无符号类型,所以又省略了一大批类型,对于数字类型Ms使用==0表示"逻辑空",我使用<=0表示"逻辑空",后面还有相关例子

注3:这样做的也是情非得已,类型太多了,其排列组合更多,好在本框架是可扩展框架,使用本框架的可以自己扩展支持类型,当然也可以开发一个类型扩展的组件(类库),需要的自己注册进去



现在开始演示类型转化基础服务

一、类型特别多,这里先拿int类型测试

1、字符串转int

2、不同数字类型转化为Int

这里我要多唠叨一句,我前面说过对”基本类型“以外的不予支持,其实意思是不支持转化为这些类型,这些类型转化为”基本类型“是没有问题的

3、object转化为int

以上例子可以看出,基本类型转化完全没有问题,其实在主框架,我也不打算默认实现复杂自定义类型的转化,这个留给扩展实现

你上面的这些功能So easy,实现过类似功能的多如牛毛,确实,基本类型转化实现简单,但是这里要强调,我做的是可扩展框架,可扩展是亮点,而且非常容易扩展

二、扩展自定义类型转化为int的例子

1、先看自定义类型代码

非常简单还是解读一下,定义了两个类型,customObj明显是个模型(Model)类,customConverter有一个方法传入一个customObj对象返回一个int值

2、再看对象转化代码

首先我们看结果,是我们预期的效果,和customConverter的Get方法的效果一致,但是我们没有直接调用customConverter.Get,甚至好像和customConverter类型都没什么关系

这里有几个关键因素,其一是GlobalServices.Convert方法是怎么运行的;其二是GlobalServices.CreateContainer()是什么鬼

3、GlobalServices.Convert方法解析

这个类型转化还是挺复杂的,挑主要的来解读

3.1 TryConvert是尝试类型转化,如果转化失败可以换一种方法再做

这种方式在本框架中有大量应用,其实就就形成一个”策略链“,每个”策略“判断一个这个问题自己是否是自己可以处理的类型,不能处理,下一个策略继续,这样非常便于扩展

在TryConvert中先调用个接口IEntityConvert,转化失败再调用IEntityAccess用来转化

这里有一个特别重要的事情,就是这个接口的对象从哪里来,这里是来自一个容器对象,这里由发现本框架的一个扩展点,只要往容器里面添加"策略"就可以增强本框架的类型转化功能,这是我为什么说主框架不打算实现复杂的类型转化,因为非常容易扩展

3.2 再看Convert主方法

A:先按当前类型尝试转化

B:转化失败判断当前对象是否为空

C:Transform.TryConvertByType

  这个简单就是强制类型转化,如果T是S的基类,这个时候就可以直接转化过去,也是非常安全的

D:再尝试IConvertible转化

前面说到系统的IConvertible定义了15种基本类型的相互排列组合转化,而且还可以使用IFormatProvider自定义转化,这就是一个强大的转化机器,不能不试

E:最后尝试把s对象转化为字符串,然后把字符串转化为目标类型(T)对象

功能是不是非常强大,也非常有别于很多类型转化工具,上来先反射,获取类型元数据,然后调用属性和字段,现在还没做测试,我这种方式可能会有明显的性能优势,但是性能现在不是我最想考虑的问题,我现在考虑的是怎么可以非常简单的扩展

4、GlobalServices.CreateContainer()是什么鬼

4.1 CreateContainer定义

从上面可以看出GlobalServices.CreateContainer就是一个再普通不过的容器,容器名是GlobalServices

前面有提到容器是可以扩展的,只要我们使用的容器支持(比如Unity、Spring.net等),我们完全可以使用配置文件来扩展类型转化,还可以使用非常炫的IOC和AOP等特性

说到这里,现在"业界"有几个类型转化工作可以做到?我稍微看了一个现在非常流行的Automapper,自定义映射确实没问题,但是映射过程还可以通过配置文件扩展或者IOC和AOP的我面见识过,如果有人看到过请告知,我要好好学习学习

4.2 其实GlobalServices容器和其他容器还是有点区别的,继续深挖源码

这里有一个不起眼的地方加了一行代码,给GlobalServices容器”吃小灶“

不挖不知道,一挖吓一跳,有一种”柳暗花明又一村“的感觉

哈哈,我就说我要对每个容器做包装,”居心不良“吧;哈哈,这样说太难定了,一句话"还是为了更好的扩展"。

4.3 没办法了,还得继续挖GlobalServices.CheckServices

这里可以看到框架支持的"基本类型",这里把这些转化策略都注册到容器中

当然如果容器中已经存在同类型的"服务",这里的注册是会忽略的

同样,就算是这里定的服务,如果觉得不好用,也可以在外面重新注册并覆盖

还有一点,前面截图可以明显看出"基础服务模块"的基本样子,但是除了”类型转化子模块“子模块其他都还没开发出来

今天实在是挖累了,暂时就挖到这里,这里还远没有完全诠释”类型转化基础服务“的可扩展性全貌,有空再补

时间: 2024-10-06 01:02:52

Asp.net 面向接口可扩展框架之类型转化基础服务的相关文章

Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)

Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各种Mapper做个简单的优缺点对比 我对第三方组件评介有三个标准,一.可用性,二.性能,三.易用性 本例子中四个四种Mapper以前我都没使用过(因为以前我都用自己的Mapper),本次测试可能不准确,错误的地方请大家指正 AutoMapper使用的是4.2.1.0,需要.net4.5支持(我使用N

Asp.net 面向接口可扩展框架之消息队列组件

消息队列对大多数人应该比较陌生.但是要提到MQ听说过的人会多很多.MQ就是英文单词"Message queue"的缩写,翻译成中文就是消息队列(我英语差,翻译错了请告知). PS:话说国人熟悉MQ比消息队列多,是不是因为国人的外语水平高于国语水平好几个数量级 1.看一下度娘怎么解释消息队列 参考链接:消息队列_百度百科 度娘解释消息队列是在两台计算机间传输的,套句很时髦的说法就是用来做分布式传输的,是个很高大上的东西 2.我的看法稍有不同 我更追溯到“消息队列”的字面“本源”的意思.我

Asp.net 面向接口可扩展框架之业务规则引擎扩展模块

随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有一定的可配置能力,想想怎么把这些地方的代码抽象提取出来.进而想到"业务规则引擎",网上找了几个都不太入"眼",就抽时间再造个"轮子" 业务规则引擎在很多成熟的工作流引擎中都有相应的模块,是工作流的核心之一.但是除了工作流很多业务都需要业务规则引擎,所

Asp.net 面向接口可扩展框架之数据处理模块及EntityFramework扩展和Dapper扩展(含干货)

面向接口数据处理模块是什么意思呢?实际上很简单,就是使用面向接口的思想和方式来做数据处理. 还提到EntityFramework和Dapper,EntityFramework和Dapper是.net环境下推崇最高的两种ORM工具. 1.EntityFramework是微软出的根正苗红的.netd的ORM工具,直接在Vs工具和Mvc框架中集成了,默认生成的项目就是使用EntityFramework的;微软也一直都在维护更新升级,最新版本最新版本都在EF7了.也迁移到了最新的.net Core平台了

Asp.net 面向接口可扩展框架之“Mvc扩展框架及DI”

标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整合了一下 一.Mvc扩展框架主要功能: 1.Mvc的依赖注入(DI)功能(类MvcDependency) 依赖IContainerFactory接口,不再依赖具体容器 2.Mvc全局过滤器(GlobalFilterProvider) 配置在Mvc的依赖注入容器中就能自动易用上,其实逻辑很简单,就是继

面向接口可扩展框架

Asp.net 面向接口可扩展框架之核心容器(含测试代码下载) 新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘回答一下) 解读一下:类是个体的定义(建模), 个体的每一方面都可以是一个接口 说白点,其一接口可以代表对象(类)一个方面,再说透点对象可能是多面手(继承多个接口),能在不同场景(作为不同接口的实例)下正常工作 其二每个接口可以有不同实

面向接口可扩展框架之“Mvc扩展框架及DI”

面向接口可扩展框架之“Mvc扩展框架及DI” 标题“Mvc扩展框架及DI”有点绕口,我也想不出好的命名,因为这个内容很杂,涉及多个模块,但在日常开发又密不可分 首先说Mvc扩展框架,该Mvc扩展就是把以前的那个Mvc分区扩展框架迁移过来,并优化整合了一下 一.Mvc扩展框架主要功能: 1.Mvc的依赖注入(DI)功能(类MvcDependency) 依赖IContainerFactory接口,不再依赖具体容器 2.Mvc全局过滤器(GlobalFilterProvider) 配置在Mvc的依赖注

Asp.net 面向接口框架之应用程序上下文作用域组件

在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定也很好扩展. 但是由于当时开发的匆忙(边开发边应用),留下一些比较致命的问题: 1.很多接口定义的不合理,通用性和扩展性不好 2.固定死了使用Unity容器,如果更大面积推广有问题,有些人已经很熟悉其他容器了,再来重新学Unity没有必要 3.配置比较麻烦,需要简化 所以我觉得有必要重新开发一个框架,对原框架取其精华去其糟粕,再吸收开源项目(含微软开放源代码的部分),争取做出一

Asp.net 面向接口框架之核心容器

新框架的容器部分终于调通了!容器实在太重要了,所有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们说从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘回答一下) 解读一下:类是个体的定义(建模), 个体的每一方面都可以是一个接口 说白点,其一接口可以代表对象(类)一个方面,再说透点对象可能是多面手(继承接口),能在不同场景(作为不同接口的实例)工作 其二每个接口可以不同实现,只要实现了这个接口,基本上就可以替换这个位置来正常工作 2.我觉得面向接