首先聲明這篇文章不是標題黨,我說的這個類庫是 FreeSql.Repository,它做爲擴展庫現實了通用倉儲層功能,接口規範參數 abp vnext,定義和實現基礎的倉儲層(CURD)。mysql
dotnet add package FreeSql.Repository
可用於:.net framework 4.6+、.net core 2.1+nginx
var fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10") .UseLogger(loggerFactory.CreateLogger<IFreeSql>()) .UseAutoSyncStructure(true) //自動遷移實體的結構到數據庫 .Build();
假設咱們有User(用戶)、Topic(主題)兩個實體,在某領域類中定義了兩個倉儲:git
var userRepository = fsql.GetGuidRepository<User>(); var topicRepository = fsql.GetGuidRepository<Topic>();
開發過程當中,我總會擔憂 topicRepository 的數據安全問題,即有可能查詢或操做到其餘用戶的主題。所以在v0.0.7版本進行了改進,增長了 filter lambad 表達式參數。github
var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1); var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
有朋友說這個功能像 abp 的租戶,但這是更小單位的過濾+驗證,確保數據安全。有朋友說這個功能省事,但我以爲是省心。sql
GuidRepository 做爲分存式倉儲將實現了分表與分庫(不支持跨服務器分庫)的封裝類。數據庫
var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");
上面咱們獲得一個日誌倉儲實例按年月分表,使用它 CURD 最終會操做 Log_201903 表。數組
注意:雖然 FreeSql 支持 CodeFirst 遷移,但不提供遷移分表,開發環境中仍然能夠遷移 Log 表。安全
FreeSql 支持數據庫讀寫分離,本功能是客戶端的讀寫分離行爲,數據庫服務器該怎麼配置仍然那樣配置,不受本功能影響,爲了方便描術後面講到的【讀寫分離】都是指客戶端的功能支持。服務器
各類數據庫的讀寫方案不一,數據庫端開啓讀寫分離功能後,讀寫分離的實現大體分爲如下幾種:異步
一、nginx代理,配置繁瑣且容易出錯;
二、中件間,如MySql可使用MyCat,可是其餘數據庫怎麼辦?
三、在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(); //強制讀【主庫】
這個點我還沒吃晚飯,對今天更新的 v0.1.11 做兩個小時的測試。以爲好請獻上寶貴一星,謝謝支持!