ASP.NET MVC經典項目ProDinner項目解析(3)


三、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層的具體實現了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM