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 ...
随机推荐
- JDBC - Oracle PreparedStatement (GeneratedKey kind) ArrayIndexOutOfBoundsException
问题: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12at oracle.jdbc. ...
- 使用 Windows PowerShell 来管理和开发 windowsazure.cn 账户的特别注意事项
6月6日,微软面向中国大陆用户开放了Microsoft Azure公众预览版的申请界面.大家可以申请免费的 beta 试用,收到内附邀请码的通知邮件后只需输入激活码即可开始免费试用.具体网址为: ht ...
- 剑指offer系列30-----删除链表中重复的节点
[题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...
- bzoj2537: [neerc2007]Language Recognition
Description DFA(确定性有限状态自动机)是一个有向图,顶点称为状态,边称为转移.每个转移用一个字母标记.对于每个状态s和每个转移l,至多有一个转移从s出发且标记为l.DFA有一个初始状态 ...
- 关于windows下c/c++的rand()的一个测试
,,,}; ,-,,}; ,y=; ;t<<<;t++){ ; x+=xs[d];y+=ys[d]; 在(x,y)绘制一个点; } 根据rand()%4的值决定点的移动方向,生成图像 ...
- Glibc 与 libc 的区别和联系
转http://blog.163.com/dragon_sjl@126/blog/static/100473339201107101517380/ 1.gcc(gnu collect compiler ...
- 浅析:setsockopt()改善socket网络程序的健壮性
1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BO ...
- DBA_Oracle DBA常用表汇总(概念)
2014-06-20 Created By BaoXinjian
- PLSQL_PLSQL中DML/DDL/DCL的概念和区分(概念)
2014-06-20 Created By BaoXinjian
- CLR如何调用虚方法、属性和事件
方法代表在类型或类型的实例上执行某些操作的代码.在类型上执行操作,称为静态方法:在类型的实例上执行操作,称为非静态方法.任何方法都有一个名称.一个签名和一个返回值(可以是void). CLR允许一个类 ...