好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ASP.NET MVC经典项目ProDinner项目解析3

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

 

 

 

 

标签:  asp.net mvc ,  prodinner

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于ASP.NET MVC经典项目ProDinner项目解析3的详细内容...

  阅读:45次