注册和配置节
补充一下上节的一些细节和考虑:
在上一节中我们可以看到,DataAccessor 和 DataMapper 承担了和数据库打交道的作用(主要是DataAccessor )
DataMapper主要负责处理缓存等的调度。
这里要说说DataMapper,其实DataMapper的功能在开始设计的时候远不止这些
DataMapper的功能除了缓存等调度外,还包括 处理表间关联的作用
(注意:处理继承的作用是使用DataAccessor来处理的)
表之间的外键的关系是有DataMapper处理的,但由于框架采用的是key值关联的缘故,因此就不存在
取一个数据树的情况(即取一个对象的数据,要附带把其关联的其他的表对象的数据取出来)
如果你是以对象关联模式来设计框架的话,DataMapper的这个作用就显露出来了
核心:
DataAccessor 处理对象间继承的关系
DataMapper 处理对象间外键关联的关系
现在我们来说说注册:
一般我们在使用对象的时候都喜欢直接实例化 比如: CUserDataMapper obj = new CUserDataMapper ()
其实我们换一种做法,在系统启动的时候就将其全部注册进去,不用在这样直接New一个新对象出来
有好处也有坏处:我个人是比较喜欢这样的方式
DataMapperRegistry
IDataAccessorRegistry
FullVersionDataAccessorRegistry
InterfaceVersionDataAccessorRegistry
NormalVersionDataAccessorRegistry
它们使用了单例模式,使用Hashtable来存储
调用方法:
NormalVersionDataAccessorRegistry.GetNormalVersionDataAccessor(typeof(CUser).Name);
这个方法通过从对象关系配置文件中获取该对象所对应的DataAccessor的Assembly 和 FullTypeName
然后使用反射生成这个DataAccessor对象
- Assembly assembly = Assembly.Load(each.DataAccessorAssembly);
- object provider = assembly.CreateInstance(each.DataAccessorFullTypeName);
- AddNormalVersionDataAccessor(fullTypeName, (NormalVersionDataAccessor)provider);
微软企业库的配置文件块提供了这些帮助
框架总共产生4个配置文件
主配置调度文件:App.config
数据库配置文件:DatabaseConfig.config
缓存配置文件:cacheconfig.config
对象关系配置文件:DomainobjectConfig.config
AOP配置文件:AspectConfigSource.config
依赖注入配置文件:UnityConfig.config
App.config的结构
<add name="CacheConfigSource" type=""
filePath="CacheConfig.config" />
<add name="DatabaseConfigSource" type=""
filePath="DatabaseConfig.config" />
<add name="DomainObjectConfigSource" type=""
filePath="DomainObjectConfig.config" />
<add name="UnityConfigSource" type=""
filePath="UnityConfig.config" />
<add name="AspectConfigSource" type=""
filePath="AspectConfigSource.config" />
对象关系配置文件的结构
- <BaseUser DomainObjectName="BaseUser" FullTypeName="Business.BaseUser"
- Modifier="AbstractClass" DataInstance="TestLocalConnection" ReadDataInstance="TestLocalConnection">
- <DataAccessorConfigCollection>
- <add DataAccessorVersion="InterfaceVersionDataAccessor" DataAccessorAssembly="Business"
- DataAccessorFullTypeName="Business.BaseUserDataAccessor" />
- </DataAccessorConfigCollection>
- </BaseUser>
- <Users DomainObjectName="Users" FullTypeName="Business.Users"
- Modifier="class" DataInstance="TestLocalConnection" ReadDataInstance="TestLocalConnection">
- <DataMapperConfigCollection>
- <add DataMapperAssembly="Business" DataMapperFullTypeName="Business.UsersDataMapper" />
- </DataMapperConfigCollection>
- <DataAccessorConfigCollection>
- <add DataAccessorAssembly="Business" DataAccessorFullTypeName="Business.UsersDataAccessor"
- DataAccessorVersion="NormalVersionDataAccessor" />
- </DataAccessorConfigCollection>
- <GeneralizationConfigCollection>
- <add BaseClass="BaseUser" BaseClassDataAccessorVersion="InterfaceVersionDataAccessor" />
- </GeneralizationConfigCollection>
- </Users>
可以从上图中看出BaseUser 和Users的关系,DataAccessor内置代码就是根据这样的配置关系
去处理继承,数据库连接,反射实例化对象这些操作的
对象关系配置文件是框架的关键性配置文件,所有的调度都是根据配置来的。
其他的配置文件暂时不在这里讲解,将作为下面的专题内容进行讲解,比如AOP,依赖注入的功能