EF Core 实现读写分离的最佳方案
前言
公司之前使用Ado.net和Dapper進(jìn)行數(shù)據(jù)訪問(wèn)層的操作, 進(jìn)行讀寫(xiě)分離也比較簡(jiǎn)單, 只要使用對(duì)應(yīng)的數(shù)據(jù)庫(kù)連接字符串即可. 而最近要遷移到新系統(tǒng)中,新系統(tǒng)使用.net core和EF Core進(jìn)行數(shù)據(jù)訪問(wèn). 所以趁著國(guó)慶假期拿出一兩天時(shí)間研究了一下如何EF Core進(jìn)行讀寫(xiě)分離.
思路
根據(jù)園子里的Jeffcky大神的博客, 參考
最簡(jiǎn)單的思路就是使用手動(dòng)切換EF Core上下文的連接, 即context.Database.GetDbConnection().ConnectionString = "xxx", 但必須要先創(chuàng)建上下文, 再關(guān)閉之前的連接, 才能進(jìn)行切換
上面的兩種方式都是從切換數(shù)據(jù)庫(kù)連接入手,但是頻繁的切換數(shù)據(jù)庫(kù)連接勢(shì)必會(huì)對(duì)性能造成影響. 我認(rèn)為最理想的方式是要避免數(shù)據(jù)庫(kù)連接的切換, 且能夠適應(yīng)多DbContext的情況, 在創(chuàng)建上下文實(shí)例時(shí),就指定好是訪問(wèn)主庫(kù)還是從庫(kù), 而不是在后期再進(jìn)行數(shù)據(jù)庫(kù)切換. 因此, 在上下文實(shí)例化時(shí),就傳入相應(yīng)的數(shù)據(jù)庫(kù)連接字符串, 這樣一來(lái)DbContext的創(chuàng)建就需要交由我們自己來(lái)進(jìn)行, 就不是由DI容器進(jìn)行創(chuàng)建了. 同時(shí)倉(cāng)儲(chǔ)應(yīng)該區(qū)分為只讀和可讀可寫(xiě)兩種,以防止其他人對(duì)從庫(kù)進(jìn)行寫(xiě)操作.
實(shí)現(xiàn)
IReadOnlyRepository接口是只讀倉(cāng)儲(chǔ)接口,提供查詢相關(guān)方法,IRepository接口是可讀可寫(xiě)倉(cāng)儲(chǔ)接口,提供增刪查改等方法, 接口的實(shí)現(xiàn)就那些東西這里就省略了.
RepositoryFactory提供倉(cāng)儲(chǔ)對(duì)象的實(shí)例化
IDbProvider 接口, 根據(jù)上下文類(lèi)型和配置文件中的數(shù)據(jù)庫(kù)連接字符串名稱創(chuàng)建IUnitOfWork, 在DI中的生命周期是Scoped,在銷(xiāo)毀的同時(shí)會(huì)銷(xiāo)毀數(shù)據(jù)庫(kù)上下文對(duì)象, 下面是它的實(shí)現(xiàn), 為了提高性能使用了Expression來(lái)代替反射.
總結(jié)
本文給出的解決方案適用于系統(tǒng)中存在多個(gè)不同的上下文,能夠適應(yīng)復(fù)雜的業(yè)務(wù)場(chǎng)景.但對(duì)已有代碼的侵入性比較大,不知道有沒(méi)有更好的方案,歡迎一起探討.
原文鏈接:https://www.cnblogs.com/KiraYoshikage/p/11628781.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的EF Core 实现读写分离的最佳方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 田牌魔术 | .NET Core 3.0
- 下一篇: 如何提高QnA maker机器人训练中文