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类型支持不好,可能造成"灵异"事件(对于一般的项目是很难碰到的,如果你能碰到,说明你对.net钻研的比较深了,普通的工程师就更不要嚷嚷说.net类型有缺陷不敢用之说,最多底层框架开发者或者架构师小心一点)

   这里就不展开了


2、IConvertible类型

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

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

  也就是这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

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

另外,会尝试IConvertible的类型相互转化,如果Ms支持的很好的IConvertible转化.这里也没道理不支持的

3、object转化为int

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

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

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

1、先看自定义类型代码

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

2、再看对象转化代码

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

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

 

三、源码解析

1、GlobalServices.Convert方法解析

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

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

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

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

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

1.2 再看Convert主方法

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

     如果策略库(容器注册)里面有当前两种类型转化的策略,性能是最好的,优先执行

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

  对象为null,放弃转化,直接返回默认值

C:Transform.TryConvertByType

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

D:再尝试IConvertible转化

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

E:再检测返回类型是否为string,如果是string直接调用对象的ToString()

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

   其实这里把字符串作为基本数据格式,相当于与对s对象序列化为字符串,然后把字符串反序列化为T类型对象,也不怪我怎么用,.net所有类型都有一个ToString()方法,所以string是个不错的中间类型

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

2、GlobalServices.CreateContainer()是什么鬼

CreateContainer定义

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

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

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

D:早期看过这篇文章的可能发现,变化很大,我把GlobalServices由静态类修改可以实例化的形式,这样就允许我们创建多套服务配置管理对象(使用子容器技术,继承默认服务并覆盖少数服务),进一步提高可扩展性

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

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

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

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

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

这里可以看到框架支持的"基本类型",把这些转化策略都注册到容器中,主要是担心容器注册的服务不够用,把不足的基本类型转化服务都注册上

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

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

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

暂时就挖到这里,还远没有完全诠释”类型转化基础服务“的可扩展性的全貌,但是该模块还在测试和完善中,只好有空再补了


相关文章

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

  • Asp.net 面向接口可扩展框架之核心容器


原文地址:http://www.cnblogs.com/xiangji/p/5440373.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

asset文件夹路径 unity_我们来捣鼓一下Unity的平台跳跃Microgame

作者&#xff1a;Truly大家好。Platformer Microgame是Unity官方的一个2D平台跳跃游戏项目模板&#xff0c;小伙伴们可以在这个模板的基础上修改或者制作自己的游戏。下边我们就来简单试玩下这个工程吧~一、资源导入写文章时&#xff0c;该资源暂时还不支持Unity 2019.x版本&am…

Oracle入门(五)之基本命令操作

一、show &#xff08;1&#xff09;查询Oracle系统变量值 语法&#xff1a;show 变量名 show all --查看所有68个系统变量值 show user --显示当前连接用户 注&#xff1a;Oracle的68个系统变量的key和默认value &#xff08;2&#xff09;查询oracle数据库当前的参数值 …

Linux工程师新法宝:在Visual Studio上用C++ 写Linux

如今我们正在开发一个新的插件&#xff0c;一个能够让开发者在 Visual Studio (以下简称 VS ) 上建构能够在 Linux 上运行 C 程序的套件。开发者可以借由这个插件将 C 程序移转到 Linux 服务器、PC 以及移动设备上&#xff0c;也同时可以借由这个插件将这些机器连结至你的 VS 上…

互联网+大赛作品_“颂中国力量 绘美好梦想”全市中小学生互联网+书画大赛作品展示(五)...

主办平顶山市教育体育局承办平顶山市教育体育局关心下一代工作委员会平顶山教育电视台教育部中国书画等级考试平顶山市招生管理办公室协办平顶山市书法家协会平顶山市美术家协会一比赛宗旨作品以中国战胜疫情为背景&#xff0c;以书法绘画为表现形式&#xff0c;真实记录全市中…

(转)Spring Boot启动过程 和 Bean初始化过程中的拓展接口详解

转自&#xff1a; Spring Boot启动过程 和 Bean初始化过程中的拓展接口详解_guyue35的博客-CSDN博客Spring Boot启动过程和 Bean初始化过程中的拓展接口详解1.背景 Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内…

Oracle入门(七B)之表空间删除数据文件未删除

转载自 oracle表空间删除数据文件未删除清理老旧数据的时候,不太熟悉操作,直接把表空间删了,未删除数据文件, HIS20170927此表空间已删除但数据文件还在,这时新创建一个表空间直接指定到这个数据文件上. create tablespace HIS20170927 datafile /oracle/oradata/****/HIS20170…

玩玩Xamarin Evolve 2016带来的新特性(一)-iOS Simulator(for Windows)

编者语&#xff1a; Xamarin Evolve 2016给不少.NET社群的朋友带来了强心剂&#xff0c;做.NET还是有前途啊&#xff0c;特别在微软开源的策略上。我会在五一假期和大家谈谈Xamarin中大家比较关注的iOS Windows模拟器&#xff0c;Xamarin Forms Previewer,还有Xamarin WorkBook…

python实现倒n字形排列_Leetcode问题库——Z形变换(Python),补充X形变换,字形

Z字形变换题目将一个给定字符串根据给定的行数&#xff0c;以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a;之后&#xff0c;你的输出需要从左往右逐行读取&#xff0c;产生出一个新的字符串&#x…

蓝绿发布,灰度发布及滚动发布

【README】 本文转自&#xff1a;理解蓝绿发布、灰度发布和滚动发布_Jitwxs的博客-CSDN博客_蓝绿发布和灰度发布的区别目前绝大多数公司的业务系统都是集群化部署&#xff0c;那么在新版本上线时&#xff0c;保证平滑稳定&#xff0c;尽量减少对线上用户的影响&#xff0c;就显…

Oracle入门(七)之表空间

表空间表空间是数据库的逻辑划分&#xff0c;一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表&#xff0c; 所以称作表空间。 Oracle数据库中至少存在一个表空间&#xff0c;即SYSTEM的表空间。 &#xff08;1&#xff09;创建表空…

让我们Core在一起:ASP.NET Core amp; .NET Core

Microsoft .NET 自 2002 年发行 v1.0 以来&#xff0c;已经过了近 14 个年头&#xff0c;在这 14 年里面&#xff0c;.NET 日渐成熟并成为 Microsoft 的重要开发平台之一&#xff0c;只要是在 Windows 平台上的相关应用&#xff0c;几乎都可以使用 .NET 以及所属的 C# 及 VB 语…

python菱形画法解释_用Python画棱形

定义一个函数画棱形def diamond(height):"""Return a string resembling a diamond of specified height (measured in lines).height must be an even integer."""L[]lines/bs\\for i in range(1,int(height/21)):aline.rjust(i,s).ljust(i*2,b…

3.操作系统接口与系统调用

【README】 本文内容总结自 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 【1】操作系统接口 0&#xff09;用户使用计算机3种方式&#xff1a; 命令行&#xff1b; 命令行执行 hello world图形界面&#xff1b;如计算机磁盘浏览器…

Oracle入门(十二A)之数据类型

Oracle数据类型 &#xff08;1&#xff09;char&#xff08;2&#xff09;varchar2&#xff08;3&#xff09;Number&#xff08;4&#xff09;Date&#xff08;5&#xff09;Blob、Clob、Nclob

在Linux以及Mac OS X启用F#

随着.NET Core的推进&#xff0c;如今我们在Linux和Mac OS X平台上也可以和原先Windows平台之下一样运行F#程序。Microsoft的F#项目经理David Stephens先生在Build 2016大会上向大家介绍了如何在Linux以及Mac OS X启用F#。 第一步需要安装.NET Core工具。这一步对于C#和F#来说是…

flask执行python脚本_如何在flask后端运行python脚本?

我有一个小瓶子应用程序&#xff0c;它接受用户输入并返回一些文本。在这里&#xff0c;用户输入被输入到另一个python脚本&#xff0c;比如temp.py&#xff0c;这个temp.py将返回一个应该返回给用户的值。例如&#xff1a;烧瓶.pyfrom flask import Flask, render_template, r…

4.操作系统历史

【README】 本文内容总结自 B站 《操作系统-哈工大李治军老师》&#xff0c;内容非常棒&#xff0c;墙裂推荐&#xff1b; 【1】IBM7094 批处理操作系统&#xff1a; 一个job 一个job的顺序执行&#xff1b; 【2】 IBM OS360 1&#xff09; 多道程序&#xff1a; 程序1 程…

Oracle入门(三)之连接与登录

一、启动Oracle服务 #cmd net start oracleserviceORCL net stop oracleserviceORCL二、进入SQLPLUS &#xff08;1&#xff09;没登录进入SQL C:\Users\mk>sqlplus /nolog #没有提示 &#xff08;2&#xff09;登录进入SQL C:\Users\mk>sqlplus C:\Users\mk>用户名:…

玩玩Xamarin Evolve 2016带来的新特性(三)-Xamarin Workbooks

编者语&#xff1a;五一祝各位劳动者快乐。今天是该系列文章的最后一篇&#xff0c;当然Evolve 2016还有很多很多的内容&#xff0c;但是我觉得iOS Simulator(for Windows), Xamarin Previewer ,以及Xamarin Workbooks是最为关键的三个技术&#xff0c;也是国内开发者比较关注的…

springboot单测用例

【README】 本文阐述了 springboot 单测开发方式&#xff1b; 【1】引入springboot 单测制品库&#xff1b; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.3.…