作者:nicye
連結:http://www.cnblogs.com/kellynic/p/10480333.html
首先宣告這篇文章不是標題黨,我說的這個類庫是 FreeSql.Repository,它作為擴充套件庫現實了通用倉儲層功能,介面規範引數 abp vnext,定義和實現基礎的倉儲層(CURD)。
安裝
dotnet add package FreeSql.Repository
可用於:.NET Framework 4.6+、.NET Core 2.1+
定義
var fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10")
.UseLogger(loggerFactory.CreateLogger())
.UseAutoSyncStructure(true) //自動遷移物體的結構到資料庫
.Build();
過濾與驗證
假設我們有User(使用者)、Topic(主題)兩個物體,在某領域類中定義了兩個倉儲:
var userRepository = fsql.GetGuidRepository();
var topicRepository = fsql.GetGuidRepository();
開發過程中,我總會擔心 topicRepository 的資料安全問題,即有可能查詢或操作到其他使用者的主題。因此在v0.0.7版本進行了改進,增加了 filter lambad 運算式引數。
var userRepository = fsql.GetGuidRepository(a => a.Id == 1);
var topicRepository = fsql.GetGuidRepository(a => a.UserId == 1);
-
在查詢/修改/刪除時附加此條件,從而達到不會修改其他使用者的資料;
-
在新增時,使用運算式驗證資料的合法性,若不合法則丟擲異常;
有朋友說這個功能像 abp 的租戶,但這是更小單位的過濾+驗證,確保資料安全。
有朋友說這個功能省事,但我覺得是省心。
分表與分庫
GuidRepository 作為分存式倉儲將實現了分表與分庫(不支援跨伺服器分庫)的封裝類。
var logRepository = fsql.GetGuidRepository(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");
上面我們得到一個日誌倉儲實體按年月分表,使用它 CURD 最終會操作 Log_201903 表。
註意:雖然 FreeSql 支援 CodeFirst 遷移,但不提供遷移分表,開發環境中仍然可以遷移 Log 表。
讀寫分離
FreeSql 支援資料庫讀寫分離,本功能是客戶端的讀寫分離行為,資料庫伺服器該怎麼配置仍然那樣配置,不受本功能影響,為了方便描術後面講到的【讀寫分離】都是指客戶端的功能支援。
各種資料庫的讀寫方案不一,資料庫端開啟讀寫分離功能後,讀寫分離的實現大致分為以下幾種:
1、nginx代理,配置繁瑣且容易出錯;
2、中件間,如MySql可以使用MyCat,但是其他資料庫怎麼辦?
3、在client端支援;
FreeSql 實現了第3種方案,支援一個【主庫】多個【從庫】,【從庫】的查詢策略為隨機方式。
若某【從庫】發生故障,將切換到其他可用【從庫】,若已全部不可用則使用【主庫】查詢。
出現故障【從庫】被隔離起來間隔性的檢查可用狀態,以待恢復。以MySQL為例:
var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" +
"Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, connstr)
.UseSlave("connectionString1", "connectionString2") //使用從資料庫,支援多個
.Build();
select.Where(a => a.Id == 1).ToOne(); //讀【從庫】(預設)
select.Master().WhereId(a => a.Id == 1).ToOne(); //強制讀【主庫】
其他特性
-
支援 CodeFirst 遷移;
-
支援 DbFirst 從資料庫匯入物體類,支援三種模板生成器;
-
採用 ExpressionTree 高效能讀取資料;
-
支援深入的型別對映,比如pgsql的陣列型別;
-
支援豐富的運算式函式;
-
支援導航屬性查詢,和延時載入;
-
支援同步/非同步資料庫操作方法,豐富多彩的鏈式查詢方法;
-
支援讀寫分離、分表分庫;
-
支援多種資料庫,MySql/SqlServer/PostgreSQL/Oracle/Sqlite;
結束語
對今天更新的 v0.1.11 作兩個小時的測試。覺得好請獻上寶貴一星,謝謝支援!
github:https://github.com/2881099/FreeSql