.NET 框架设计(理解)c#、.NET Library 整理(二)

1、扩展方法:

     扩展方法是让我们在不改变原有代码的情况下动态的添加方法的方式,这给面向对象设计、模块设计带来了质的提升。

      以往想要在一个类中添加某个方法,需要特别小心,尤其在设计动态下发DLL的时候。在这里,我们完全可以将扩展方法添加独立于一个干净的DLL中,与具体的被扩展类区分开,这样就减少问题的出现。

      扩展方法可以使我们进行链接式编程。扩展方法是可以动态扩展某个类型,关键是任何类型,包括接口。试想一下,如果我们将扩展方法与对象的继承链绑定起来的话,会产生什么样的奇妙效果?

2、部分类、部分方法

       部分类和部分方法是编译时的动态合并功能,并非运行时的,时C#与编译器为了帮助我们进行局部独立变化而用的。他可以将类的定义分开在一个或多个类文件中,这为代码自动生成提供了良好的环境。自动生成的代码时重复性的工作,而手动编写的都是核心的业务逻辑。比如一个领域实体,其大部分字段都与持久化设备有直接的映射关系,而行为方法却是和具体的业务逻辑相关的,所以前者时相对固定的,而后者时需要经大脑思考才能得出的,无法自动生成。但是,这两者都是属于某个领域实体的不同部分,一个是数据,一个是逻辑,它们都属于对象的必要元素,所以到最后都需要合成一个完整的对象。

        部分类、部分方法为框架的开发提供了对外扩展这样一个强大的功能,我们可以将部分代码通过插件的方式自动生成,而部分方法我们只保留抽象定义部分,就好像设计模式中的模板方法模式。最后将业务逻辑和自动生成的代码完美结合。

         灵活运行这两个特性会使框架的设计更加深入,自动完成的工作也会大大增加,像一些服务契约、调用接口其实都是可以结合不分类和部分方法进行设计。

2、特性、元数据

        特性可以理解为附加在类型上的一段数据属性,可以称为类型的元数据。强大的是这些元数据可以在运行时动态获取,这就为我们在运行时动态辨别一些逻辑架起了桥梁的作用。特性可以说时框架设计中必须要使用的一个技术点,因为他是契约式设计和AOP设计的基础。他帮我们将复杂的业务逻辑和基础设施分隔开来,而在运行时又动态结合在一起。

     public enum TransferSourceType // 转账类型

           { salary,reimburse,loan}

[AttributeUsage(AttributeTargets.Paramer)]

public class TransferSource:Attribute    // 转账元数据

{ publicTransfer Source TypeTransfer Type{get;set}};

public partial class Employee   // 员工实体

{

     public void TransferToEmployee([TransferSource(TransferType =TransferSourceType.Salyry)] int ToNumber)

        {}

}

=======================

参数元数据通常用来作为上游对下游的约定,也就是说用来获取参数特性的功能点时在方法的调用端,然后根据该方法所用的参数元数据来约定该参数。比如这里我们使用类似转账的特性元数据,上游HR控制端可以控制传入到这个方法的数据只能时跟员工工资、报销、借款等员工应得的钱相关的,不会发送除此之外的其他数据过来,而且前后顺序还不能搞错。

3、反射、代码对象模型、动态编译、动态缓存

     反射时在运行时动态获取.NET类型元数据的功能。

       一个开发时的OO对象经过编译变成本地代码时,就不会再存在所谓的面向对象概念,而是一堆只对计算机本身运行有用的指令。那么我们在运行时如何继续使用在开发时通用的OO概念,这就是反射的意义。

     在运行时,.NET会将我们定义的每一个类型保存一份元数据表,这就是我们要在运行时动态获取一个类型的元数据的基础元数据字典。而这个字典时字符级别的定义,也就是说动态反射获取类型元数据时会进行字符级别的查找匹配。字符的模式匹配时非常消耗资源的,这就是我们时常所说的反射将会影响性能的地方。

      那么我们在使用这个强大的功能时如何避开这个性能损耗点呢?比较经典的解决方法是在运行时动态生成代码,然后再进行动态编译,最后再动态缓存起来。这是一贯的解决思路,但是具体要控制到什么力度,还需要客观的衡量业务背景。

      我们刚才提到的动态生成代码,那么这就将使用到.NET 的CodeDom模块,这个模块是.NET提供给开发人员用来动态的生成代码用的,而他的一套对象模型对应着代码的结构,所以说这也是CodeDom的由来之因。

      对DOM有了解的朋友应该很容易理解这个概念:DOM文档对象模型的意思是通过文档来保存对象的结构,也就是说是对象的文档持久化。我们只要能明白,文档的结构与对象的结构从某种角度看是一致的,而且很容易将其序列化和反序列化。

     通过.NET提供的一套CodeDom模块生成代码之后,就可以通过.NET提供的动态编译模块将一组代码字符串动态的编译成可以直接运行的内存对象,这样我们就可以将原本需要很多反射步骤才能完成的事情通过直接调用的方式完成,这将大大提高程序的性能。

      最后将动态生成的对象缓存起来,在下一次需要的时候再直接读取出来使用。这就保证反射对性能的消耗只在第一次,而后续的同样的功能将等同于类级别的直接调用。

 

 

 

 

 

 

    

 

 

 

你可能感兴趣的:(.NET 框架设计(理解)c#、.NET Library 整理(二))