C簡單構架之EF進行讀寫分離+多資料庫(Mysql/SqlService)
最近因為項目需要,研究了下EF的讀寫分離,所以做了一個demo進行測試,下面是項目的結構
表現層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的上下文操作進行封裝
///
///
[DbConfigurationType(typeof(MySqlEFConfiguration))] public MySqlContext : base("DefaultConnection") { ///
public MySqlContext(string connenction) : base(connenction) { } ///
protected override void OnModelCreating(DbModelBuilder modelBuilder) View Code /// 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 ` View Code public class MvcApplication : System.Web.HttpApplication //Autofac //Autofac初始化過程 View Code 通過上面多資料庫的支持已經完成,下面進行讀寫分離,分別進行繼承上述上下文操作 /// public class WriteSqlServiceContext : SqlServiceContext public class ReadSqlServiceContext : SqlServiceContext View Code 通過工廠類進行初始化 /// public static class Contextfactory /// /// View Code 最後配置webcofig即可 View Code 最後進行測試 public class TestController : Controller public TestController(ITestService TestServiceDb) { View Code 搞定,可能在代碼上有點累贅,但是總算是可行的。 如果有興趣的朋友可以留下郵箱,然後發全代碼一起研究,謝謝!
public class MySqlContext : DbContext
{
public DbSet
///
///
}
///
///
///
///
{
}
}
///
{
///
///
}
///
///
}
///
///
{
}
}
///
{
public static DbContextType DbContextType { get; set; }
///
///
public static void Initialize(DbContextType ContextType)
{
string IsUsedWR = System.Configuration.ConfigurationManager.AppSettings["IsUsedWR"];
DbContextType = ContextType;
///獲得資料庫最後一個版本
// Database.SetInitializer
if (ContextType == DbContextType.SqlService)
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion
if (IsUsedWR == "1") {
Database.SetInitializer(new MigrateDatabaseToLatestVersion
}
else
{
Database.SetInitializer
}
}
else
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion
if (IsUsedWR == "1")
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion
}
else
{
Database.SetInitializer
}
//Database.SetInitializer
// Database.SetInitializer
}
// Database.SetInitializer
///刪除原來資料庫 重新創建資料庫
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges
// Database.SetInitializer
}
}
{
protected void Application_Start
{
AreaRegistration.RegisterAllAreas;
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//ContainerBuilder builder = new ContainerBuilder;
//builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly);
//IContainer container = builder.Build;
//DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
ContainerBuilder builder = new ContainerBuilder;
builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly);//註冊mvc容器的實現
var assemblys = BuildManager.GetReferencedAssemblies.Cast
builder.RegisterAssemblyTypes(assemblys.ToArray).Where(t => t.Name.Contains("Service")).AsImplementedInterfaces;
var container = builder.Build;
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
//初始化資料庫
DBInitializer.Initialize(DbContextType.MySql);
}
}
///
{
public WriteSqlServiceContext : base("") { }
}
///
///
{
public ReadSqlServiceContext : base("") { }
}
///
{
///
///
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
{
var DbContext = GetContext(OpertionType);
return (TEntity)DbContext;
}
}
{
private ITestService _TestServiceDb { get; set; }
_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;
}
}
※在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