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的更多相关文章

  1. XF 文档 - Element Framework Doc

    配置篇 Chapter Configuration Schema篇 Chapter Schema 查询篇 Chapter Querying Data 数据更改及验证篇 Chapter Data Mod ...

  2. openstack-ansible Chapter 4. Deployment configuration

    Initial environment configuration Copy the contents of the /opt/openstack-ansible/etc/openstack_depl ...

  3. SymmetricDS文档翻译--【Chapter 3. 具体配置(Configuration)[section C]】

    3.6. Routers 眼下的实现中提供的Route实现包括: 1.      Default Router:这个Router发送全部的数据到Router中定义的目标节点所属的组中的全部的节点. 2 ...

  4. P6 EPPM Installation and Configuration Guide 16 R1 April 2016

    P6 EPPM Installation and Configuration Guide 16 R1         April 2016 Contents About Installing and ...

  5. 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 ...

  6. Chapter 5: Container

    Chapter 5: Container A container is a module that processes the requests for a servlet and populates ...

  7. CCJ PRML Study Note - Chapter 1.6 : Information Theory

    Chapter 1.6 : Information Theory     Chapter 1.6 : Information Theory Christopher M. Bishop, PRML, C ...

  8. [转载]Spring Annotation Based Configuration

    Annotation injection is performed before XML injection, thus the latter configuration will override ...

  9. [转] Spring - Java Based Configuration

    PS: Spring boot注解,Configuration是生成一个config对象,@Bean指定对应的函数返回的是Bean对象,相当于XML定义,ConfigurationProperties ...

随机推荐

  1. 转载:使用sklearn做单机特征工程

    目录 1 特征工程是什么?2 数据预处理 2.1 无量纲化 2.1.1 标准化 2.1.2 区间缩放法 2.1.3 标准化与归一化的区别 2.2 对定量特征二值化 2.3 对定性特征哑编码 2.4 缺 ...

  2. Oracle无法启动,ORA-01034、ORA-01078

    因为调整32位系统的SGA区大小时不慎,超出可用内存,造成Oracle实例无法启动,报出ORA-01034.ORA-01078等错误.如下图 sqlplus /nolog SQL> conn / ...

  3. RMAN备份与恢复之数据文件

    备份数据文件,模拟磁盘损坏时,还原恢复数据文件. 首先,查询数据文件序号,备份数据文件,可根据数据文件序号指定备份的数据文件. SQL SQL> select file_name,file_id ...

  4. Shell学习:sed命令

    http://blog.sina.com.cn/s/blog_a56ef5490101cn58.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行 ...

  5. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  6. scala之method和function的区别

    在我没有学习scala的时候,主要用java和python做日常工作开发,印象中,没有特别的刻意的去区分method和function的区别,这个关系,正如我们日常生活中,没有刻意的去区分质量和重量. ...

  7. Struts2 - Convertion

    Struts2中的Convertion插件是比较有用,它可以简化很多操作,比如不需要一个一个Action在struts.xml中设置.当然,最有意义的是它与rest插件一起整合使用,可以完成web-s ...

  8. 2015年8月TIOBE编程语言排行榜

    名副其实的月经贴.

  9. 什么是SQLCLR与使用

    原帖地址:http://www.cnblogs.com/hsrzyn/archive/2013/05/28/1976555.html 什么是SQLCLR SQL CLR (SQL Common Lan ...

  10. Python 正则表达式-OK

    Python正则表达式入门 一. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分. 正则表达式是用于处理字符串的强大工具, 拥有自己独特的语法以及一个独立的处理引擎, 效率上 ...