导航

Chapter Configuration

Posted on 2015-10-08 23:41  木儿壳子  阅读(191)  评论(0编辑  收藏  举报

Chapter Configuration

 

Web.config App.configconfiguration节,插入如下配置:

 

<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

 

注意:一个实例配置文件对应于一个数据库,而不是一个数据库连接(字符串)。XFEF不同,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会根据以下配置创建一个继承自NameMapSingularPluralNameMap实例,构造函数的参数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(此处UsersTableName),会配置到<User>的主键Field

      "Sequence-{0}-{1}",如数据库中定义了Sequence-Users-Id(此处UsersTableName,IdColumnName),会配置到<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会缓存每个实例的PrimarySchemaNamedSchemas。并通过监视实例配置文件的变化,来更新缓存。

 

当数据库结构发生变化,不但包括TableColumn,也包括Foreign keySequence等的改变。通过改变DatabaseVersion来通知XF刷新缓存。

下面的版本号的作用也是一样。

 

NameMap有如下的构造函数:

public NameMap(XElement nameMapConfig)

nameMapConfig必须有XAttribute DatabaseVersion

 

public NameMap(XElement nameMapConfig, string nameMapVersion)

nameMapConfig 如有XAttribute DatabaseVersion,其值必须与参数nameMapVersion一致。

 

nameMapConfig,还可以有XAttribute DatabaseVersion,如存在会和DataBaseDatabaseVersion对比校验。

 

PrimaryConfig,必须有XAttribute ConfigVersionNameMapVersion DatabaseVersion可选,如存在分别会检查与NameMapDataBase一致否。

 

NamedConfig,必须要有XAttribute NameNamedConfigVersionVersion可选,如存在会检查与PrimarySchema一致否。

 

Modifying,无必须的XAttribute。同样,Version可选。如存在会检查与PrimarySchema一致否。

Modifying也可以有XAttribute Name,此Name不会覆盖NamedSchemaName,而会成为NamePath的一部分。