三、Data層解析
這一層主要是和數據庫相關聯的, 所以這一層直接關系到應用程序的健壯性。最近在各個渠道都在提大數據這個概念,大數據高並發,尤其是facebook倡導的基於java應用的Hadoop框架, 如火如荼, 也從各個層面得到這樣的消息或者說法, net在大數據高並發處理上比不上java, 這點我暫時不去評論他, 但是EF框架無法處理大數據, 我還是需要保留個人觀點的。因為某些架構師自身對EF框架的不熟悉而對次妄加評論。我相信Code First模式是處理大數據的一個很好的方式。當然,基於EF框架的大數據或者說基於NET框架這樣的經典案例確實太少的。插點題外話,我們進入MVC。
ProDinner使用的是Code First方式的EF框架,App.config就不去多說了, 無論采取那種方式, 連接數據庫的配置還是需要的, 這里要說下, 在我VS中打開基於類庫方式的EF, 連接數據庫的配置文件肯定在這個類庫的App.config中,但是如果是WEB項目運行的話, WEB項目看見的只是這個類庫的DLL, 配置文件還是需要去web.cnofig中尋找, 所以, 我們在生成好類庫后, 記得將連接字符串也copy到web.config中,否則會報錯哦.
--- Db.cs
CodeFirst模式的本地數據庫類,繼承了DbContext.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Dinner>().HasMany(r => r.Meals).WithMany(o => o.Dinners).Map(f => { f.MapLeftKey("DinnerId"); f.MapRightKey("MealId"); }); modelBuilder.Entity<User>().HasMany(r => r.Roles).WithMany(o => o.Users).Map(f => { f.MapLeftKey("UserId"); f.MapRightKey("RoleId"); }); base.OnModelCreating(modelBuilder); }
這個重寫方法的用處就是,建立表的映射關系和外鍵引用關系, 如果你的引用關系比較復雜的話, 估計這里需要的代碼量不會少.
---DbContextFactory.cs
public interface IDbContextFactory { DbContext GetContext(); } public class DbContextFactory : IDbContextFactory { private readonly DbContext dbContext; public DbContextFactory() { dbContext = new Db(); } public DbContext GetContext() { return dbContext; } }
在使用EF框架的時候,DbContext實例化必須要保持唯一性,針對於應用程序多層設計,在技術每一層或多個方法調用的時候, 我們使用的這個數據實體上下文必須要唯一。所以這里使用的是靜態的變量和靜態只讀的構造函數保持唯一,在我的個人項目中我同樣用到了其他方式保證這個上下文唯一性
public class Db { Protected DbContext dbcontext; public Db() { dbcontext=new Db(); } } ....... public class Aservice:Db { public void Hell() { dbcontext.A................. } } ...........................
當然還有一種方式
public class DbContextFactory { public static LikaContext GetDbContext() { //當第二次執行的時候直接取出線程嘈里面的對象 //CallContext:是線程內部唯一的獨用的數據槽(一塊內存空間) //數據存儲在線程棧中 //線程內共享一個單例 LikaContext dbcontext = CallContext.GetData("DbContext") as LikaContext; //判斷線程里面是否有數據 if (dbcontext == null) //線程的數據槽里面沒有次上下文 { //創建了一個EF上下文 dbcontext = new LikaContext(); //存儲指定對象 CallContext.SetData("DbContext", dbcontext); } return dbcontext; } }
其實三種方式, 就是三種設計模式.
----DelRepo.cs
----Repo.cs
----UniRepo.cs
三個類通過List<T>具體實現了Core層的三個抽象接口類,T就是在具體使用的時候運用的類型了.
這一層相對來說是對Core層的具體實現了.