配置及扩展
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.Data
或 MySqlConnector
中的任意一个 nuget
包来适配,它会按顺序搜寻你有没有引用了对应的 nuget
包。比如你在项目中同时引入了 MySql.Data
和 MySqlConnector
,那么它就会使用 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 方法注射扩展服务。下面的示例中,注册了 IGeneratorProvider
、ISyntaxProvider
等的实现。
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"
}
]
}
}
}
}
}