onnectionOptions> DbConnections { get; set; }
}
public class FxOptionsSetup: IConfigureOptions<FxOptions>
{
private readonly IConfiguration _configuration;
public FxOptionsSetup(IConfiguration configuration)
{
_configuration = configuration;
}
/// <summary>
/// 配置options各属性信息
/// </summary>
/// <param name="options"></param>
public void Configure(FxOptions options)
{
SetDbConnectionsOptions(options);
// ...
}
private void SetDbConnectionsOptions(FxOptions options)
{
var dbConnectionMap = new Dictionary<string, DbConnectionOptions>();
options.DbConnections = dbConnectionMap;
IConfiguration section = _configuration.GetSection("FxCore:DbConnections");
Dictionary<string, DbConnectionOptions> dict = section.Get<Dictionary<string, DbConnectionOptions>>();
if (dict == null || dict.Count == 0)
{
string connectionString = _configuration["ConnectionStrings:DefaultDbContext"];
if (connectionString == null)
{
return;
}
dbConnectionMap.Add("DefaultDb", new DbConnectionOptions
{
ConnectionString = connectionString,
DatabaseType = options.DefaultDatabaseType
});
return;
}
var ambiguous = dict.Keys.GroupBy(d => d).FirstOrDefault(d => d.Count() > 1);
if (ambiguous != null)
{
throw new Exception($"数据上下文配置中存在多个配置节点拥有同一个数据库连接名称,存在二义性:{ambiguous.First()}");
}
foreach (var db in dict)
{
dbConnectionMap.Add(db.Key, db.Value);
}
}
}
/// <summary>
/// DbContextOptionsBuilder配置选项
/// </summary>
public class DbContextOptionsBuilderOptions
{
/// <summary>
/// 配置DbContextOptionsBuilder, dbName指定数据库名称, 为null时表示所有数据库,默认为null
/// </summary>
/// <param name="build"></param>
/// <param name="dbName"></param>
/// <param name="dbContextType"></param>
public DbContextOptionsBuilderOptions(DbContextOptionsBuilder build, string dbName = null, Type dbContextType = null)
{
Builder = build;
DbName = dbName;
DbContextType = dbContextType;
}
public DbContextOptionsBuilder Builder { get; }
public string DbName { get; }
public Type DbContextType { get; }
}
FxOptions是业务系统的配置选项(随便取得), 在通过service.GetService<IOptions
>()时会调用IConfigureOptions
完成FxOptions的初始化. DbContextOptionsBuilderOptions用来提供DbContextOptionsBuilder的相关配置
public interface IDbContextOptionsBuilderUser
{
/// <summary>
/// 获取 数据库类型名称,如 SQLSERVER,MYSQL,SQLITE等
/// </summary>
DatabaseType Type { get; }
/// <summary>
/// 使用数据库
/// </summary>
/// <param name="builder">创建器</param>
/// <param name="connectionString">连接字符串</param>
/// <returns></returns>
DbContextOptionsBuilder Use(DbContextOptionsBuilder builder, string connectionString);
}
public class SqlServerDbContextOptionsBuilderUser : IDbContextOptionsBuilderUser
{
public DatabaseType Type => DatabaseType.SqlServer;
public DbContextOptionsBuilder Use(DbContextOptionsBuilder builder, string connectionString)
{
return builder.UseSqlServer(connectionString);
}
}
IDbContextOptionsBuilderUser接口用来适配不同的数据库来源
使用
{
"FxCore": {
"DbConne