當前位置:
首頁 > 知識 > C簡單構架之EF進行讀寫分離+多資料庫(Mysql/SqlService)

C簡單構架之EF進行讀寫分離+多資料庫(Mysql/SqlService)

最近因為項目需要,研究了下EF的讀寫分離,所以做了一個demo進行測試,下面是項目的結構

C簡單構架之EF進行讀寫分離+多資料庫(Mysql/SqlService)

表現層view

主要提供Web、WebApi等表現層的解決方案

公共層public

主要提供項目公共類庫,數據緩存基礎方法等

實體層model

主要提供資料庫映射模型,還有就是DDD領域操作模型

數據層Db

主要封裝EF操作基礎類

數據服務層Service

主要提供資料庫操作服務、緩存操作服務

數據介面服務層inface

主要提供資料庫操作服務介面、緩存操作服務介面

1.首先是多資料庫的支持,目前就支持mysql/sqlservice,如果需要添加更多的資料庫支持,只需要再資料庫操作類型上面添加即可

///

/// 資料庫類型
///

public enum DbContextType : byte
{
SqlService = 1,
MySql = 2
}

View Code

分別對mysql/sqlservice的上下文操作進行封裝

///

/// MySql操作類
///

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MySqlContext : DbContext
{
public DbSet TestEntities { get; set; }
///

/// 配置默認的字元串鏈接
///

public MySqlContext : base("DefaultConnection") {
}
///

/// 自定義資料庫鏈接
///

/// public MySqlContext(string connenction) : base(connenction) { }
///

/// 實體對應規則的映射配置
///

/// protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}

View Code

///

/// Sql資料庫操作類
///

public class SqlServiceContext : DbContext
{
///

/// 配置默認的字元串鏈接
///

public SqlServiceContext {
}
///

/// 自定義資料庫鏈接
///

/// public SqlServiceContext(string connenction) : base(connenction) {
}
///

/// 實體對應規則的映射配置
///

/// protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}

View Code

在view調用時候,進行ef上下文初始化只需要設置類型

///

/// 資料庫策略初始化類
///

public static class DBInitializer
{
public static DbContextType DbContextType { get; set; }
///

/// 資料庫初始化策略配置
///

`
public static void Initialize(DbContextType ContextType)
{
string IsUsedWR = System.Configuration.ConfigurationManager.AppSettings["IsUsedWR"];
DbContextType = ContextType;
///獲得資料庫最後一個版本
// Database.SetInitializer(new MigrateDatabaseToLatestVersion);
if (ContextType == DbContextType.SqlService)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion);
if (IsUsedWR == "1") {
Database.SetInitializer(new MigrateDatabaseToLatestVersion);
}
else
{
Database.SetInitializer(null);
}
}
else
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion);
if (IsUsedWR == "1")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion);
}
else
{
Database.SetInitializer(null);
}
//Database.SetInitializer(null);
// Database.SetInitializer(null);
}
// Database.SetInitializer(null);
///刪除原來資料庫 重新創建資料庫
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges);
// Database.SetInitializer(new DropCreateDatabaseIfModelChanges);
}
}

View Code

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start
{
AreaRegistration.RegisterAllAreas;
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);

//Autofac
//ContainerBuilder builder = new ContainerBuilder;
//builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly);
//IContainer container = builder.Build;
//DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

//Autofac初始化過程
ContainerBuilder builder = new ContainerBuilder;
builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly);//註冊mvc容器的實現
var assemblys = BuildManager.GetReferencedAssemblies.Cast.ToList;
builder.RegisterAssemblyTypes(assemblys.ToArray).Where(t => t.Name.Contains("Service")).AsImplementedInterfaces;
var container = builder.Build;
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
//初始化資料庫
DBInitializer.Initialize(DbContextType.MySql);
}
}

View Code

通過上面多資料庫的支持已經完成,下面進行讀寫分離,分別進行繼承上述上下文操作

///

/// 讀
///

public class WriteSqlServiceContext : SqlServiceContext
{
public WriteSqlServiceContext : base("") { }
}
///

/// 寫
///

public class ReadSqlServiceContext : SqlServiceContext
{
public ReadSqlServiceContext : base("") { }
}

View Code

通過工廠類進行初始化

///

/// 上下文工廠類
///

public static class Contextfactory
{
///

/// 獲取上下文
///

///
public static DbContext GetContext(DbOpertionType OpertionType)
{
DbContextType ContextType = DBInitializer.DbContextType;
if (ContextType == DbContextType.MySql)
{
if (OpertionType == DbOpertionType.Read)
return new ReadMySqlContext;
else
return new WriteMySqlContext;
}
else
{
if (OpertionType == DbOpertionType.Read)
return new ReadSqlServiceContext;
else
return new WriteSqlServiceContext;
}
}
///

/// 獲取上下文操作
///

///
/// ///
public static TEntity CallContext(DbOpertionType OpertionType) where TEntity: DbContext
{
var DbContext = GetContext(OpertionType);
return (TEntity)DbContext;
}
}

View Code

最後配置webcofig即可








View Code

最後進行測試

public class TestController : Controller
{
private ITestService _TestServiceDb { get; set; }

public TestController(ITestService TestServiceDb) {
_TestServiceDb = TestServiceDb;
}
// GET: Test
public ActionResult Index
{
var result = _TestServiceDb.AddEntity(new Test { ID=Guid.NewGuid, Age=11, CreateTime=DateTime.Now, Name="Test" });
var NewResult = _TestServiceDb.GetEntityByID(result.ID);
return View;
}
}

View Code

搞定,可能在代碼上有點累贅,但是總算是可行的。

如果有興趣的朋友可以留下郵箱,然後發全代碼一起研究,謝謝!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

在windows下使用Qt5開發GTK3圖形界面應用程序
angular2/angular4 如何通過$http的post方法請求下載二進位的Excel文件
帶著問題寫React Native原生控制項--Android視頻直播控制項
html5中cookie介紹,封裝以及添加,獲取,刪除

TAG:科技優家 |

您可能感興趣

Mysql8.0主從搭建,shardingsphere+springboot+mybatis讀寫分離
python後台架構Django——連接讀寫mysql資料庫
SpringBoot 玩轉讀寫分離
mysql+mycat實現主從複製、讀寫分離
提升Hive操作Amazon S3讀寫數據的性能
索尼推出Ultra-Tough系列三防SSD移動硬碟:最高讀寫速度1000MB/s
用fread和fwrite讀寫文件
Multi Actuator多讀寫臂技術,新的性能突破
文石BOOX Note Pro和Nova Pro電紙書正式發布:讀寫全能帶前光
Mushkin推出新款M.2 SSD:主打性價比 連續讀寫500MB/s
MapReduce數據序列化讀寫概念淺析!
Realtek首發SD 7.0主控:最大容量128TB、讀寫1GB/s
Realtek首發SD 7.0主控:最大容量128TB、讀寫1GB/s
希捷提出Multi Actuator技術,以多一組讀寫臂的方式增加存取效率
Python讀寫Excel表格,就是這麼簡單粗暴又好用
讀寫超3GB/s 瑞昱展全新NVMe SSD主控
威剛發布512GB microSD存儲卡:讀寫速度不俗
DuangDuangDuang,黨禺書法藝術叢書《讀寫經典》正式上線了!
LVS+MYCAT讀寫分離+MYSQL同步部署+故障自動轉移
瑞昱展示全新NVMe SSD主控:讀寫均超3GB/s