最近有efcore跨庫查詢的需求,研究了下colder框架裡文件的分庫實現,發現並不能完全實現一個介面下的跨庫查詢請求,只能滿足一個業務層構造指定的唯一一個資料庫訪問介面。
先說下文件是怎麼實現的
DbAccessor實現使用多資料庫
預設框架會自動注入IDbAccessor作為資料庫訪問介面,在需要的時候注入即可,若系統需要操作多個資料庫,那麼需要定義額外的介面繼承IDbAccessor然後配置注入進去即可訪問
-
先定義新的介面IMyDbAccessor
-
然後配置資料庫型別和連線字串
-
使用IMyDbAccessor
這樣就可以在任何地方注入並使用IMyDbAccessor,更多資料庫同理配置即可
--上面的缺陷在於BaseBussiness 中只能構造一個IMyDbAccessor,也就是說只能注入和使用一個資料庫的資料訪問介面。
DbFactory.GetDbAccessor()實現 (推薦)
不需要像上面那樣事先依賴注入,再寫自己的IMyDbAccessor介面繼承IDbAccessor。
直接使用EFCore.Sharding中的DbFactory資料工廠
using EFCore.Sharding; using Microsoft.Extensions.Logging; namespace EFCore.Sharding { // // 摘要: // 資料庫工廠 public static class DbFactory { // // 摘要: // 根據配置檔案獲取資料庫型別,並返回對應的工廠介面 // // 引數: // conString: // 完整資料庫連結字串 // // dbType: // 資料庫型別 // // loggerFactory: // 日誌工廠 public static IDbAccessor GetDbAccessor(string conString, DatabaseType dbType, ILoggerFactory loggerFactory = null); // // 摘要: // 獲取ShardingDbAccessor // // 引數: // absDbName: // 抽象資料庫 // // 返回結果: // ShardingDbAccessor public static IShardingDbAccessor GetShardingDbAccessor(string absDbName = "BaseDb"); } }
appsetting.json程式碼