配置及扩展


  Fireasy 里的数据库提供者是比较灵活的,它允许你自己去实现并通过配置进行使用,这样你可以去适配更多的数据库类型。


1、自定义提供者

  当你使用其他类型的数据库时,你可以自己实现提供者来给应用程序使用。继承 ProviderBase 类,然后重写必要的方法即可。或是直接实现 IProvider 接口。

  在继承 ProviderBase 类时,注意要重写构造函数,它允许你提供一组 IProviderFactoryResolver,目的是实现数据库驱动组件的识别与加载。它有以下两种实现:


  • AssemblyProviderFactoryResolver

  它要求你指定提供 DbProviderFactory 的类型命名,格式为 "命名空间.类名, 程序集名"。比如 MySqlProvider 构造函数的定义如下:

public class MySqlProvider : ProviderBase
{
    public MySqlProvider()
        : base(new AssemblyProviderFactoryResolver(
            "MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data", 
            "MySql.Data.MySqlClient.MySqlClientFactory, MySqlConnector"))
    {
    }
}

  它表示你可以提供 MySql.DataMySqlConnector 中的任意一个 nuget 包来适配,它会按顺序搜寻你有没有引用了对应的 nuget 包。比如你在项目中同时引入了 MySql.DataMySqlConnector,那么它就会使用 MySql.Data


  • InstallerProviderFactoryResolver

  这只有在 .net framework 下才支持。它是通过 DbProviderFactories 类的 GetFactory 方法来获取系统中安装的实例工厂。比如 MsSqlProvider 构造函数的定义如下:

public class MsSqlProvider : ProviderBase
{
    public MsSqlProvider()
#if NETSTANDARD
        : base(new AssemblyProviderFactoryResolver(
            "System.Data.SqlClient.SqlClientFactory, System.Data.SqlClient"))
#else
        : base(new InstallerProviderFactoryResolver("System.Data.SqlClient"))
#endif
    {
    }
}

2、注册扩展服务

  在构造函数中,使用 RegisterService 方法注射扩展服务。下面的示例中,注册了 IGeneratorProviderISyntaxProvider 等的实现。

public class MySqlProvider : ProviderBase
{
    public MySqlProvider()
        : base(new AssemblyProviderFactoryResolver("MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data", "MySql.Data.MySqlClient.MySqlClientFactory, MySqlConnector"))
    {
        RegisterService<IGeneratorProvider, BaseSequenceGenerator>();
        RegisterService<ISyntaxProvider, MySqlSyntax>();
        RegisterService<ISchemaProvider, MySqlSchema>();
        RegisterService<IBatcherProvider, MySqlBatcher>();
        RegisterService<IRecordWrapper, GeneralRecordWrapper>();
    }
}

3、配置提供者

  当你自己定义了提供者或扩展服务后,你需要在配置文件中进行配置使用。比如你实现了一个对 DB2 数据库的适配,则按下面的示例进行配置:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="dataProviders" type="Fireasy.Data.Provider.Configuration.ProviderConfigurationSectionHandler, Fireasy.Data" />
  </configSections>
  <fireasy>
    <dataProviders>
      <provider name="db2" type="demo.DB2Provider, demo" />
    </dataProviders>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "dataProviders": {
      "settings": {
        "db2": {
          "type": "demo.DB2Provider, demo"
        }
      }
    }
  }
}

  另外,如果你的提供者里没有实现扩展服务,则可以使用 inherited 继承一个原生的提供者服务集(对应的是 IProvider 里的 ProviderName 属性)。

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="dataProviders" type="Fireasy.Data.Provider.Configuration.ProviderConfigurationSectionHandler, Fireasy.Data" />
  </configSections>
  <fireasy>
    <dataProviders>
      <provider name="mysql" type="demo.MySqlProvider, demo">
        <service type="demo.MySqlSyntaxProvider, demo" />
      </provider>
      <provider name="excel" inherited="OleDb">
        <service type="Fireasy.Data.Syntax.ExcelOleDbSyntax, Fireasy.Data"></service>
      </provider>
    </dataProviders>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "dataProviders": {
      "settings": {
        "mysql": {
          "type": "demo.MySqlProvider, demo",
          "services": [
            {
              "type": "demo.MySqlSyntaxProvider, demo"
            }
          ]
        },
        "excel": {
          "inherited": "OleDb",
          "services": [
            {
              "type": "Fireasy.Data.Syntax.ExcelOleDbSyntax, Fireasy.Data"
            }
          ]
        }
      }
    }
  }
}