Fork me on GitHub

搭建三层架构(ASP.NET MVC+EF)

昨天面试的时候最后做了一道上机题,竟然跪了,跪就跪在没有搭好框架,连接数据库总是程序报错。

回来之后亲自搭了一下框架,弄好后放到博客上。下图就是搭建好后,整个框架的结构就是这样,下面对框架中的文件进行讲解。

搭建步骤:

1.数据库建好后,由数据库生成实体模型。

2.添加BLL、DAL层两个类库。

3.在DAL层先建工厂EFContextFactory.cs,下面是创建上下文对象的方法。

 

namespace DAL
{
    class EFContextFactory
    {
        #region 从线程的数据槽中获得上下文对象
        /// <summary>
        /// 从线程的数据槽中获得上下文对象
        /// </summary>
        /// <returns></returns>
        public static DbContext GetDbContextFromContext()
        {
            DbContext context = CallContext.GetData("Dbcontext") as mssjEntities;
            if (context == null)
            {
                context = new mssjEntities();
                CallContext.SetData("Dbcontext", context);
            }
            return context;
        }
        #endregion
    }
}

 

  4.之后是创建BaseDAL.cs,BaseDAL中先获取EF上下文实体,然后再通过实体写公用的方法。

namespace DAL
{
   public class BaseDAL<T> where T:class,new()
    {
       //下面是两种写法获取EF上下文对象,
       private DbContext db = EFContextFactory.GetDbContextFromContext();
       protected DbContext DataContext
       {
           get { return EFContextFactory.GetDbContextFromContext(); }
       }


       /// <summary>
       /// 根据查询条件获取单个实体
       /// </summary>
       /// <param name="condition"></param>
       /// <returns></returns>
       public T GetModel(Expression<Func<T, bool>> condition)
       {
           return DataContext.Set<T>().Where(condition).FirstOrDefault();
       }
    }
}

5.建立文件UserDAL.cs,这个是数据表映射实体所对应的DAL文件。

namespace DAL
{
    /// <summary>
    /// UserDAL继承BaseDAL
    /// </summary>
   public class UserDAL:BaseDAL<User>
    {
       /// <summary>
       /// 在这里声明实例化一个UserDAL的对象
       /// </summary>
       public static readonly UserDAL GetUserDAL = new UserDAL();
       private UserDAL() { }
    }
}

6.接下来在BLL层先建一个BaseBLL。

namespace BLL
{
  public abstract  class BaseBLL<T> where T:class,new()
    {
      /// <summary>
      /// 构造方法中,创建仓储。
      /// </summary>
      public BaseBLL()
      {
          SetCurrentRepository();
      }
      /// <summary>
      /// CurrentRepository属性在BaseBLL的子类中用到
      /// </summary>
      protected BaseDAL<T> CurrentRepository
      {
          get;
          set;
      }
      //设置成抽象方法,子类继承时,应该重写抽象方法。
      public abstract void SetCurrentRepository();


      /// <summary>
      /// 根据查询条件获取单个实体
      /// </summary>
      /// <param name="condition"></param>
      /// <returns></returns>
      public T GetModel(Expression<Func<T, bool>> condition)
      {
          return CurrentRepository.GetModel(condition);
      }

    }
}

7.创建UserBLL.cs继承BaseBLL.cs。

namespace BLL
{
   public class UserBLL:BaseBLL<User>
    {
       /// <summary>
        /// 在这里声明实例化一个UserBLL的对象
       /// </summary>
       public static readonly UserBLL GetUserBLL = new UserBLL();
       /// <summary>
       /// 要对BaseBLL中的抽象方法进行实现。
       /// </summary>
       public override void SetCurrentRepository()
       {
           CurrentRepository = UserDAL.GetUserDAL;//CurrentRepository属性在BaseBLL中定义
       }
    }
}

8.至此,BLL、DAL层搭建完毕,接下来把数据库的链接字符串复制到Web.config中,之后启动网站。打断点进行监视,便发现数据库已经链接成功,这样一个简单的框架就算搭好了。

注意:1.Web层,DAL层需要引用EntityFramework的dll。因为EntityFramework有版本问题,所以都去引用Model层中bin文件夹下的dll。

         2.Model层是另外三个层必须引用的。

 

posted @ 2016-09-20 22:06  神雕爱大侠  阅读(7223)  评论(2编辑  收藏  举报