NET Core表分割、読み書き分離を実現する汎用Repository機能


まず、この文章はタイトル党ではなく、このクラスのライブラリはFreeSql.Repositoryであり、拡張ライブラリとしては汎用倉庫機能を実現しています。インターフェース規範はabp vnextを参照して定義し、ベースの倉庫層(CURD)を実現しました。
インストール
dotnet add package Free Sql.Repository
使用可能:.net frame ew 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<IFreeSql>())
 .UseAutoSyncStructure(true) //             
 .Build();
フィルタと検証
User(ユーザ)とTopic(主題)の二つのエンティティがあると仮定し、ある分野において二つの倉庫を定義した:

var userRepository = fsql.GetGuidRepository<User>();
var topicRepository = fsql.GetGuidRepository<Topic>();
開発の過程で、私はいつもtopicRepositoryのデータセキュリティ問題、つまり他のユーザーのテーマを調べたり操作したりすることができると心配しています。従ってv 0.0.7バージョンを改良して、filter lambond式パラメータを増加しました。

var userRepository = fsql.GetGuidRepository<User>(a => a.Id == 1);
var topicRepository = fsql.GetGuidRepository<Topic>(a => a.UserId == 1);
  • は、他のユーザのデータを変更しないようにするために、この条件をクエリ/変更/削除する際に追加する。
  • 追加時に、表式を使ってデータの合法性を検証し、もし違反したら異常を投げます。
  • 友達によると、この機能はabpのテナントのようですが、これはより小さい単位のフィルタリング+検証で、データの安全を確保します。
    この機能は大丈夫だと友達に言われましたが、気が楽だと思います。
    分表と分庫
    GidRepositoryはデポジットとして、デポジットとデポジットのパッケージクラスを実現します。
    
    var logRepository = fsql.GetGuidRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now.ToString("YYYYMM")}");
    上に私達は1つの日誌の倉庫の実例を得て、年月によって表して、それを使ってCURDは最終的にLog〓を操作します。201903表です。
    注意:Free SqlはCodeFirstの移転をサポートしていますが、移転分表は提供されておらず、開発環境でもLogテーブルを移転することができます。
    読み書き分離
    Freee Sqlはデータベースの読み書き分離をサポートしています。本機能はクライアントの読み書き分離行為です。データベースサーバはどのように配置すればいいですか?本機能の影響を受けないで、線画術の後に述べる「読み書き分離」はクライアントの機能サポートです。
    各種データベースの読み書きプログラムは違っています。データベースの端が読み書き分離機能を開いた後、読み書き分離の実現は大体以下の種類に分けられます。
    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(); //   【  】
    その他の特性
  • [x]CodeFirst移動をサポートします。
  • [x]は、DbFirstがデータベースからエンティティクラスを導入することをサポートし、三つのテンプレートジェネレータをサポートする。
  • [x]ExpressitionTree高機能読取データを採用する。
  • [x]は、pgsqlの配列タイプなどの深いタイプのマッピングをサポートする。
  • [x]豊富な表現関数をサポートします。
  • [x]ナビゲーション属性クエリと遅延負荷をサポートします。
  • [x]同期/非同期データベース操作方法、多彩なチェーンクエリ方法をサポートします。
  • [x]読み書き分離、分表ライブラリをサポートします。
  • [x]マルチデータベース、MySql/Sql Server/PostgreSQL/Oracle/Sqliteをサポートします。
  • 結尾語
    以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。