zoukankan      html  css  js  c++  java
  • ASP.NET MVC经典项目ProDinner项目解析3

    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层的具体实现了.

     

     

    当前标签: prodinner

     
    ASP.NET MVC经典项目ProDinner项目解析(3) aspnetdream 2013-04-25 23:33 阅读:796 评论:0  
     
    ASP.NET MVC经典项目ProDinner项目解析(2) aspnetdream 2013-04-14 21:47 阅读:1310 评论:2  
     
    ASP.NET MVC经典项目ProDinner项目解析(1) aspnetdream 2012-03-02 21:52 阅读:2514 评论:7

     

     

     

     

  • 相关阅读:
    洛谷P1129 [ZJOI2007] 矩阵游戏(二分图最大匹配)
    牛客NC51316 Going Home (二分图最大权匹配)
    洛谷P2055 [ZJOI2009]假期的宿舍(二分图最大匹配)
    Codeforces Round #702 (Div. 3) 全部七题
    Educational Codeforces Round 104 (Rated for Div. 2) A~D
    Leetcode 567. 字符串的排列(滑动窗口)
    基于macOS Catalina 10.15.7下GitHub Pages + Hexo 5.3.0 + 阿里云的博客部署
    关于两个数的LCM
    2021牛客寒假算法基础集训营1 补题 ABCEFIJ
    macOS上运行jupyter notebook程序:服务似乎挂掉了,但是会立刻重启 报错OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialize
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3044620.html
Copyright © 2011-2022 走看看