Elite Container DELPHI下的一个轻量级IoC对象容器

1、简介:

  Elite Container是DELPHI下的一个轻量级IoC对象容器(IoC:Inverse of Control,反转控制)。它是参考了Java中的Spring框架(主要是配置文件的写法),并结合DELPHI的特色来构建的。相比Spring的对象容器,它提供的功能更为精简经常使用(如对象延迟建立、对象属性自动注入等),下降了学习的难度,而且提供了不少扩展点,你只需简单地写一个插件实现类,并在配置文件中进行简单配置,就可让Elite Container拥有你的自定义功能!

  Elite Container主要拥有如下的一些特性:
  
  一、不管使用或不使用BPL,均可以用Elite Container来构建你的程序(但不建议用纯DLL,由于各DLL中,同一个类的类型信息是不一样的,不熟悉相关知识的话,有可能会带来一些问题,而这自己并非Elite Container的问题)
  二、支持多种属性注入类型,如直接值、枚举、集合、StringList、ObjectList等。其中StringList这种注入方式,在解决键值对配置时很是有用,详细请参看相关例子
  三、支持构造函数注入。但因为Delphi的元信息不够完备,有时须要写一个构造函数调用类(写法很简单),才可以让容器正确调用该类和其子类的构造函数,详细请看相关例子另外因为构造函数注入有可能会引发循环注入的问题,所以建议尽可能使用属性注入来表达对象的依赖关系,不得已的时候才使用构造函数注入
  四、支持对象配置的继承。省去配置子对象时,又要把父对象的属性配置从新拷贝一遍,既麻烦又难维护。
  五、支持对象属性的自动注入。若是你的属性命名知足必定规则,即可以利用自动注入来省去大量的配置书写
  六、支持配置文件的引入,提升配置文件的可重用性
  七、支持多种对象的生命周期配置(对于无状态的管理类,如逻辑层,单例生命周期是最经常使用的)
  八、支持对象的别名配置
  九、加强的对象注册机制,可注册非TPersistent为基类的类(常见的如TInterfacedObject),而且容器能够区分不一样单元的同名类
  十、兼容使用Delphi的RegisterClass来注册类的遗留模块
  十一、大量的自定义插件扩展点。你能够自定义本身的属性注入配置方式、构造函数注入配置方式、对象配置引入方式、对象生命周期管理方式、对象属性自动注入方式等
  十二、支持对象的延迟建立。以避免容器初始化时,会自动实例化一些须要花费大量时间来建立,而又不多用的类。
  1三、大量的可编程接口。你甚至能够本身写一个用INI、或数据库来进行配置的IoC容器!

  借助Elite Container和Ioc思想,你能够更轻易地构建出具备松散耦合、重用度高的应用程序。它的核心思想就是拆分功能的接口和实现,上层只依赖于下层的接口,而后经过Elite Container的配置,把不一样的实现类注入到该接口中,达到更换功能,也就是复用已有代码的目的。设计人员能够真正地发挥好本身的面向对象思想和相关设计模式,来架构企业级的应用程序,而无需象之前那样,在Delphi中用起面向对象总有点捉襟见袖的感受。

  DEMO下载地址:http://download.csdn.net/source/1891434数据库

2、使用Elite Container的典型开发步骤:

  一、新建项目,在项目选项中选择“build with runtime packages”,去掉全部的默认包,而后选择EliteContainerD7
  二、创建应用程序的领域(如对象实体、逻辑处理、接口服务等)
  三、用XML文件来配置这些对象
  四、引用elXMLConfigurateContainer单元,声明一个IelObjectContainer类型的接口变量
  五、给这个接口建立一个TelXMLConfigurateContainer的实例,把这个XML文件的路径(相对或绝对路径都可,构造函数有参数指定),做为参数传入到构造函数中
  六、TelXMLConfigurateContainer建立的时候,会自动初始化生命周期配置为"singleton",而且不是延迟建立的对象
  七、如今能够根据配置文件所配置的对象ID或别名,从容器中获取已配置好的对象或接口了
  八、调用所获取的对象或接口,来完成程序的功能编程

3、DEMO目录说明:

  Bin 各个例子的可执行程序
  Bin\Config 各个例子所用到的配置文件
  Lib 各个例子用到的dcp文件,须要在项目设置的"Build with runtime packages"中引入
  Source 各个例子的源代码。共26个例子,用于详细介绍Elite Container的特性。请务必结合源代码、配置文件和可执行文件来理解,这样才能达到演示的目的。若是要编译例子源代码的话,请把Lib目录添加到Delphi的Library Path下,并修改下项目的输出路径。设计模式

4、DEMO简要说明:

  例1:示范了容器最基本的功能。如何获取一个配置好的对象,包括以对象形式获取(GetObj),和以接口的形式获取(GetIntf)。

  例2:示范了容器最基本的功能。与例1不一样的是,这个例子中,类被封装了在BPL当中。这种方式是项目实际开发时,最经常使用的方式(以便重用业务逻辑)。注意在配置对象的时候,对象的class配置,还要加上类所在的bpl文件,而后还要在程序中对类进行注册。

  例3:示范了如何把直接值(字符串、整数等)注入到属性中。这种方式经常使用于利用配置来改变对象的某些初始状态,例如能够把数据库连接串以这种方式注入到对象中,以便不用从新编译也能改变程序的数据库连接。

  例4:示范了如何把枚举或集合注入到属性中。强大的是,配置中,你既能够写枚举的字符串名称,也能够写枚举的整数值。

  例5:示范了如何把其它配置的对象注入到属性中。属性能够是对象类型,也能够是接口类型(假如被注入的对象,实现了该接口)。这是最经常使用的注入方式,例如把数据访问对象注入到业务逻辑对象中,以便让业务逻辑对象访问数据库。

  例6:示范了如何配置一个StringList对象,并把它注入到属性中。从配置文件中能够看到,配置的方式很是多。其中KeyValueList和ObjectRefList这两个属性的配置都采用类键值对的形式,这种形式在解决映射关系时,是很经常使用的。

  例7:示范了如何配置一个ObjectList对象,并把它注入到属性中。注意,ObjectList的OwnsObject参数是默认被设置为false的,也就是说,释放这个ObjectList,不会释放里面的对象。由于Elite Container的单例声明周期是最经常使用的,所以对象的生命周期应由容器来管理,不该该在ObjectList释放的时候就释放。不过也能够直接把ObjectList配置成管理生命周期,例如它里面的对象的生命周期被配置了为"prototype"的时候。你须要清楚地知道对象的生命周期是如何被管理的,才可正确使用好这种注入方式。

  例8:示范了如何配置一个InterfaceList对象,并把它注入到属性中。

  例9:示范了对象属性自动注入的功能。能够设置为根据属性名称("T"加上属性名来做为对象ID)、属性类型或自动模式,来尝试从容器中获取对象。自动注入会做用于没有手动配置,不是只读,类型是对象或接口的那些属性上。自动注入默认是关闭的(值为"false"),而按属性名称,是最经常使用的自动注入模式。

  例10:示范了继承父对象的属性配置。才可以配置文件能够看到,TMyObjectB的Count、Text、Day这三个属性的值,均继承了TMyObjectA中的设置。强大的是,你还能进行属性配置的覆盖,能够看到TMyObjectB中Day的值是wdTuesday,而不是TMyObjectA中配置的wdMonday。

  例11:示范了构造函数注入。注意要配置构造函数参数的类型,常见的取值有string、integer、float、boolean、string、enum、set、object、interface等。

  例12:示范了对象配置的引入。一般咱们能够给各个组件写独立的配置文件,而后主程序引入这几个组件的配置文件便可。这样便重用了组件的配置文件了。注意,若是对象的配置量很是巨大,能够经过设置lazy="true"来延迟载入该配置文件。

  例13:示范了对象的生命周期配置。默认的三种生命周期是:单例"singleton",该对象的实例由容器来管理(不要本身释放掉它),而且每次获取都是获得同一个实例,这种生命周期是默认的生命周期;原型"prototype",容器只负责对象的建立,而不负责实例的释放,你须要本身来管理它的生命周期;线程单例"per-thread",本质也是单例模式,可是每条线程里都会有一个不一样的单例。

  例14:示范了对象的别名声明。此功能经常使用于整合资源,例如几个组件分别声明了数据库连接的对象ID,我能够经过声明别名,把这几个数据库连接的对象ID都指向同一个对象,那么就实现了几个组件用同一个数据库连接了。

  例15:示范了完成注入后,让对象进行初始化处理。一般能够在这里检查对象的属性有被注入,由于写漏配置的现象有时仍是难以免的。

  例16:示范了如何兼容使用RegisterClass来注册类的老模块。其实使用上是彻底同样的,没任何特殊之处。

  例17(进阶功能):示范了如何注入DELPHI自带的类。要注意的是,要手动对这些类进行下注册,其它就没什么特殊了。

  例18(进阶功能):示范了如何获取不一样单元中的同名类。配置中,class注意要加上类所在的单元名。

  例19(进阶功能):示范了自定义属性注入的处理。你须要分别写一个属性值识别器和属性值注入器,而后把它在配置中进行配置便可。能够看到,例子的配置中,属性出现了自定义的类型"path"。

  例20(进阶功能):示范了自定义构造函数注入的处理。你须要分别写一个构造函数参数值识别器和构造函数参数值注入器,而后把它在配置中进行配置便可。能够看到,例子的配置中,构造函数参数出现了自定义的类型"owner-selector"。

  例21(进阶功能):示范了如何自定义对象配置引入机制。例子中把对象的配置封装在了DLL中,对配置起到了简单的保护做用。由于Delphi被大量使用在客户端程序中,这跟Java是有区别的。所以这能够说是具备Delphi特点的一个颇有用的扩展点。

  例22(进阶功能):示范了自定义对象的生命周期管理方式。

  例23(进阶功能):示范了自定义的对象属性自动注入器的编写。

  例24(进阶功能):示范了如何写构造函数调用器。当出现如下两种状况时,你才须要为类写一个构造函数调用器:基类的构造函数不是虚函数,而你在子类中又声明了该构造函数;基类的构造函数虽然是虚函数,可是在子类中,你对它进行了从新声明,或者提供了重载的版本。通常调用器的逻辑,须要检查参数的个数、签名,根据重载的版本,判断参数是否存在,参数类型是否正确等。

  例25(进阶功能):示范了对象属性的延迟获取。例子中获取TExample时,三个属性均是没值的,只有在它们被访问到的时候,才用容器中获取所配置的对象。这样便大大增长了TExample的获取速度(这三个属性所配置的类,为了演示须要,在建立时都人工sleep了一段时间做为延迟)

  例26(进阶功能):示范了如何注册不是TPersistent做为基类的类。架构

5、其它说明:

  Elite Container可支持Delphi 7以上的任何版本,目前暂只提供D7的版本供试用。另外放出此DEMO,主要的目的是为了能及时收集你们的反馈意见而已,容器自己不能够避免尚会存在一些问题,如内存泄露、缺少线程保护等,暂时请勿用于实际项目中,不然后果自负。框架

相关文章
相关标签/搜索