ASP.NET MVC经典项目ProDinner项目解析(3)
三、Data層解析
?
?
這一層主要是和數(shù)據(jù)庫相關(guān)聯(lián)的, 所以這一層直接關(guān)系到應(yīng)用程序的健壯性。最近在各個渠道都在提大數(shù)據(jù)這個概念,大數(shù)據(jù)高并發(fā),尤其是facebook倡導(dǎo)的基于java應(yīng)用的Hadoop框架, 如火如荼, 也從各個層面得到這樣的消息或者說法, net在大數(shù)據(jù)高并發(fā)處理上比不上java, 這點(diǎn)我暫時不去評論他, 但是EF框架無法處理大數(shù)據(jù), 我還是需要保留個人觀點(diǎn)的。因?yàn)槟承┘軜?gòu)師自身對EF框架的不熟悉而對次妄加評論。我相信Code First模式是處理大數(shù)據(jù)的一個很好的方式。當(dāng)然,基于EF框架的大數(shù)據(jù)或者說基于NET框架這樣的經(jīng)典案例確實(shí)太少的。插點(diǎn)題外話,我們進(jìn)入MVC。
ProDinner使用的是Code First方式的EF框架,App.config就不去多說了, 無論采取那種方式, 連接數(shù)據(jù)庫的配置還是需要的, 這里要說下, 在我VS中打開基于類庫方式的EF, 連接數(shù)據(jù)庫的配置文件肯定在這個類庫的App.config中,但是如果是WEB項(xiàng)目運(yùn)行的話, WEB項(xiàng)目看見的只是這個類庫的DLL, 配置文件還是需要去web.cnofig中尋找, 所以, 我們在生成好類庫后, 記得將連接字符串也copy到web.config中,否則會報錯哦.
--- Db.cs
CodeFirst模式的本地數(shù)據(jù)庫類,繼承了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);}這個重寫方法的用處就是,建立表的映射關(guān)系和外鍵引用關(guān)系, 如果你的引用關(guān)系比較復(fù)雜的話, 估計這里需要的代碼量不會少.
---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實(shí)例化必須要保持唯一性,針對于應(yīng)用程序多層設(shè)計,在技術(shù)每一層或多個方法調(diào)用的時候, 我們使用的這個數(shù)據(jù)實(shí)體上下文必須要唯一。所以這里使用的是靜態(tài)的變量和靜態(tài)只讀的構(gòu)造函數(shù)保持唯一,在我的個人項(xiàng)目中我同樣用到了其他方式保證這個上下文唯一性
public class Db {Protected DbContext dbcontext;public Db(){dbcontext=new Db();} }.......public class Aservice:Db {public void Hell(){dbcontext.A.................} }...........................當(dāng)然還有一種方式
public class DbContextFactory{public static LikaContext GetDbContext(){//當(dāng)?shù)诙螆?zhí)行的時候直接取出線程嘈里面的對象//CallContext:是線程內(nèi)部唯一的獨(dú)用的數(shù)據(jù)槽(一塊內(nèi)存空間)//數(shù)據(jù)存儲在線程棧中//線程內(nèi)共享一個單例LikaContext dbcontext = CallContext.GetData("DbContext") as LikaContext;//判斷線程里面是否有數(shù)據(jù)if (dbcontext == null) //線程的數(shù)據(jù)槽里面沒有次上下文 {//創(chuàng)建了一個EF上下文dbcontext = new LikaContext();//存儲指定對象CallContext.SetData("DbContext", dbcontext);}return dbcontext;}}?
其實(shí)三種方式, 就是三種設(shè)計模式.
?
----DelRepo.cs
----Repo.cs
----UniRepo.cs
三個類通過List<T>具體實(shí)現(xiàn)了Core層的三個抽象接口類,T就是在具體使用的時候運(yùn)用的類型了.
?
這一層相對來說是對Core層的具體實(shí)現(xiàn)了.
轉(zhuǎn)載于:https://www.cnblogs.com/aspnetdream/archive/2013/04/25/3043813.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC经典项目ProDinner项目解析(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老虞学GoLang笔记-数组和切片
- 下一篇: .NET程序员应该理解的几种软件保护方法