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. Oracle自增主键的添加[sequence]--表数据已存在

    --增加主键ID ); --设置sequence使ID自增 create sequence SEQ_ID minvalue maxvalue start ; --将id的值设置为sequence Up ...

  2. MySQL数据库表中有usage字段名后的后果

    一个很奇怪的42000的错误,折腾了我一晚上.... 我的系统是Spring + SpringMVC + MyBatis结构, 数据库的mapper以及model等文件都是用MyBatisGenera ...

  3. 【JDBC】向数据表插入数据时,自动获取生成的主键

    数据表设计时,一般都会有一个主键(Key)(自己指定),有时也可以使用联合主键: 有许多数据库提供了隐藏列为表中的每行记录分配一个唯一键值(如:rowid): 当我们没有指定哪一列作为主键key时,数 ...

  4. php返回状态200或者300的写法

    header("HTTP/1.0 200 OK"); phpinfo(); header("HTTP/1.0 300 OK"); phpinfo();

  5. 在Myeclipse中移除项目对Hibernate的支持

    在Myeclipse中移除项目对Hibernate的支持 在使用Hibernate框架进行开发时可能会遇到配置错误或者需要删除Hibernate支持的情况.下面就说一下如何彻底移除项目的Hiberna ...

  6. 怎样进行Android UI元素设计

    Android UI元素里面包含了许多的内容,比如:该平台由操作系统.中间件.用户界面和应用软件组成,一个应用程序要想受用户喜爱,那么UI可不能差. Android为相似的编程名词引入了一些新的术语, ...

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

  8. linux 鼠标中键粘帖功能?!!

    转载自:http://yjhexy.iteye.com/blog/785564 ubuntu鼠标中键问题,其实也不是什么问题,ubuntu的鼠标中键是用来快速粘贴的,只是windows用惯了,时不时手 ...

  9. 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

  10. java和C++在多态实现上的区别

    1:java中没有虚函数的概念,但是有抽 象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某 ...