Chapter Configuration
Chapter Configuration
在Web.config 或App.config的configuration节,插入如下配置:
<configuration>
……
<configSections>
<section name="elementFramework" type="XData.Data.Configuration.ElementFrameworkConfigurationSection,ElementFramework" />
</configSections>
<elementFramework>
<instances directory="instances" watch="True" delay="1000" />
</elementFramework>
……
</configuration>
其中:
<instances
directory="instances" 指定实例配置文件所在的目录,必须,可以有多个实例配置文件。
watch="True" 是否监视实例配置文件的变化,可选,默认为False。为False时,忽略配置delay。
delay="1000" 实例配置文件有变化后,响应的延迟时间(去抖动),以毫秒计,可选,默认为1000,且小于1000无效。
/>
实例配置文件是一个xml文件,其后缀为.xf.xml。在用new ElementContext() 或 new ElementContext(string instanceName)创建ElementContext实例时使用。
前者使用default.xf.xml,后者使用instanceName指定的.xf.xml文件,如new ElementContext(“hr”)会使用hr.xf.xml。
注意:一个实例配置文件对应于一个数据库,而不是一个数据库连接(字符串)。XF与EF不同,XF被设计成无状态,因此一个数据库对应多个实例,是没有意义的。
以下内容,需先阅读Chapter Schema。
典型的实例配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<elementFramework>
<instance>
<!-- XF会根据以下配置创建一个XData.Data.Objects.SqlDatabase(用于SQL Server数据库)实例,ElementFramework指出程序集名称(这里是ElementFramework.dll)。
它继承自抽象类:
public abstract partial class Database
{
public Database(string connectionString, string databaseVersion)
...
}-->
<database type="XData.Data.Objects.SqlDatabase,ElementFramework">
<connectionString type="System.String" value="Data Source=.\SQLEXPRESS;Initial Catalog=Membership;Integrated Security=True" />
<databaseVersion type="System.String" value="1" />
</database>
<!--XF会根据以下配置创建一个继承自NameMap的SingularPluralNameMap实例,构造函数的参数nameMapConfig,来自<nameMapConfigGetter>。-->
<nameMap type="XData.Data.Objects.SingularPluralNameMap,ElementFramework">
<nameMapConfig type="System.Xml.Linq.XElement" getter="nameMapConfigGetter" />
<nameMapVersion type="System.String" value="2" />
</nameMap>
<!--FileNameMapConfigGetter只是简单地载入一个NameMapConfig配置文件(在此是map.xml),它继承自抽象类:
public abstract class NameMapConfigGetter
{
public abstract XElement GetNameMapConfig();
...
}
XF还内置一个PrefixSuffixNameMap类,用法与SingularPluralNameMap相似,只是单复数规则改为前缀后缀。-->
<nameMapConfigGetter type="XData.Data.Objects.FileNameMapConfigGetter,ElementFramework">
<fileName type="System.String" value="map.xml" />
</nameMapConfigGetter>
<!--XF会根据以下配置创建一个SequenceConfigGetter实例,<format>为构造函数提供实参。它继承自抽象类:
public abstract class DatabaseConfigGetter
{
// XF 调用时,注入
internal protected XElement DatabaseSchema { get; set; }
public abstract XElement GetDatabaseConfig();
...
}
SequenceConfigGetter根据参数format,提供为Column设置<Sequence>。
"Sequence-{0}",如数据库中定义了Sequence-Users(此处Users为TableName),会配置到<User>的主键Field。
"Sequence-{0}-{1}",如数据库中定义了Sequence-Users-Id(此处Users为TableName,Id为ColumnName),会配置到<User>的<Id>。-->
<databaseConfigGetter type="XData.Data.Objects.SequenceConfigGetter,ElementFramework">
<format type="System.String" value="Sequence-{0}" />
</databaseConfigGetter>
<!--XF会根据此配置创建一个FilePrimaryConfigGetter实例。它继承自抽象类:
public abstract class PrimaryConfigGetter
{
// XF 调用时,注入
internal protected XElement DatabaseSchema { get; set; }
public abstract XElement GetPrimaryConfig();
...
}
FilePrimaryConfigGetter简单地载入fileName指定的一个配置文件(此处为config.xml),作为primaryConfig。其构造函数为:
public FilePrimaryConfigGetter(string configVersion, string fileName)-->
<primaryConfigGetter type="XData.Data.Objects.FilePrimaryConfigGetter,ElementFramework">
<configVersion type="System.String" value="3" />
<fileName type="System.String" value="config.xml" />
</primaryConfigGetter>
<!--XF会根据此配置创建一个DirectoryNamedConfigsGetter实例,其构造函数只有一个参数directory,用于指出命名配置文件存放的目录。
它继承自抽象类:
public abstract class NamedConfigsGetter
{
internal protected XElement PrimarySchema { get; set; }
public abstract IEnumerable<XElement> GetNamedConfigs();
...
}-->
<namedConfigsGetter type="XData.Data.Objects.DirectoryNamedConfigsGetter,ElementFramework">
<directory type="System.String" value="NamedConfigs" />
</namedConfigsGetter>
</instance>
</elementFramework>
实例配置文件,其实就是为指定的数据库创建一个PrimarySchema和一批(0到多个)NamedSchema。这与Chapter Schema描述是一致的。
不通过实例配置文件,创建ElementContext实例
ElementContext还有一个构造函数:
public ElementContext(Database database, NameMap nameMap, XElement primaryConfig, IEnumerable<XElement> namedConfigs)
注意:这里没有databaseConfig参数,其内容合并在primaryConfig。
版本号
XF会缓存每个实例的PrimarySchema和NamedSchemas。并通过监视实例配置文件的变化,来更新缓存。
当数据库结构发生变化,不但包括Table和Column,也包括Foreign key,Sequence等的改变。通过改变DatabaseVersion来通知XF刷新缓存。
下面的版本号的作用也是一样。
NameMap有如下的构造函数:
public NameMap(XElement nameMapConfig)
nameMapConfig必须有XAttribute DatabaseVersion
public NameMap(XElement nameMapConfig, string nameMapVersion)
nameMapConfig 如有XAttribute DatabaseVersion,其值必须与参数nameMapVersion一致。
nameMapConfig,还可以有XAttribute DatabaseVersion,如存在会和DataBase的DatabaseVersion对比校验。
PrimaryConfig,必须有XAttribute ConfigVersion。NameMapVersion 与 DatabaseVersion可选,如存在分别会检查与NameMap、DataBase一致否。
NamedConfig,必须要有XAttribute Name和NamedConfigVersion。Version可选,如存在会检查与PrimarySchema一致否。
Modifying,无必须的XAttribute。同样,Version可选。如存在会检查与PrimarySchema一致否。
Modifying也可以有XAttribute Name,此Name不会覆盖NamedSchema的Name,而会成为NamePath的一部分。
Chapter Configuration的更多相关文章
- XF 文档 - Element Framework Doc
配置篇 Chapter Configuration Schema篇 Chapter Schema 查询篇 Chapter Querying Data 数据更改及验证篇 Chapter Data Mod ...
- openstack-ansible Chapter 4. Deployment configuration
Initial environment configuration Copy the contents of the /opt/openstack-ansible/etc/openstack_depl ...
- SymmetricDS文档翻译--【Chapter 3. 具体配置(Configuration)[section C]】
3.6. Routers 眼下的实现中提供的Route实现包括: 1. Default Router:这个Router发送全部的数据到Router中定义的目标节点所属的组中的全部的节点. 2 ...
- P6 EPPM Installation and Configuration Guide 16 R1 April 2016
P6 EPPM Installation and Configuration Guide 16 R1 April 2016 Contents About Installing and ...
- P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1
P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1 May ...
- Chapter 5: Container
Chapter 5: Container A container is a module that processes the requests for a servlet and populates ...
- CCJ PRML Study Note - Chapter 1.6 : Information Theory
Chapter 1.6 : Information Theory Chapter 1.6 : Information Theory Christopher M. Bishop, PRML, C ...
- [转载]Spring Annotation Based Configuration
Annotation injection is performed before XML injection, thus the latter configuration will override ...
- [转] Spring - Java Based Configuration
PS: Spring boot注解,Configuration是生成一个config对象,@Bean指定对应的函数返回的是Bean对象,相当于XML定义,ConfigurationProperties ...
随机推荐
- Oracle自增主键的添加[sequence]--表数据已存在
--增加主键ID ); --设置sequence使ID自增 create sequence SEQ_ID minvalue maxvalue start ; --将id的值设置为sequence Up ...
- MySQL数据库表中有usage字段名后的后果
一个很奇怪的42000的错误,折腾了我一晚上.... 我的系统是Spring + SpringMVC + MyBatis结构, 数据库的mapper以及model等文件都是用MyBatisGenera ...
- 【JDBC】向数据表插入数据时,自动获取生成的主键
数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...
- php返回状态200或者300的写法
header("HTTP/1.0 200 OK"); phpinfo(); header("HTTP/1.0 300 OK"); phpinfo();
- 在Myeclipse中移除项目对Hibernate的支持
在Myeclipse中移除项目对Hibernate的支持 在使用Hibernate框架进行开发时可能会遇到配置错误或者需要删除Hibernate支持的情况.下面就说一下如何彻底移除项目的Hiberna ...
- 怎样进行Android UI元素设计
Android UI元素里面包含了许多的内容,比如:该平台由操作系统.中间件.用户界面和应用软件组成,一个应用程序要想受用户喜爱,那么UI可不能差. Android为相似的编程名词引入了一些新的术语, ...
- Source insight 3572版本安装及An invalid source insight serial number was detected解决方法
Source insight有最新版3572.3.50.0076 下载连接:http://www.sourceinsight.com/down35.html, http://www.sourcei ...
- linux 鼠标中键粘帖功能?!!
转载自:http://yjhexy.iteye.com/blog/785564 ubuntu鼠标中键问题,其实也不是什么问题,ubuntu的鼠标中键是用来快速粘贴的,只是windows用惯了,时不时手 ...
- 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()
在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...
- java和C++在多态实现上的区别
1:java中没有虚函数的概念,但是有抽 象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某 ...