1. 程式人生 > >三層架構搭建(asp.net mvc + ef)

三層架構搭建(asp.net mvc + ef)

face 方式 change queryable 數據 .get 關註 clas tor

第一次寫博客,想了半天先從簡單的三層架構開始吧,希望能幫助到你!

簡單介紹一下三層架構, 三層架構從上到下分:表現層(UI),業務邏輯層(BLL),數據訪問層(DAL)再加上數據模型(Model),用ef訪問數據庫,Model也就是與數據庫表映射的實體。廢話少說,上代碼。

  • Model層

為方便說明,新建一個實體模型UserInfo,數據庫表中應該對應一個UserInfo表,至於怎樣建立表,有多種方式,用ef來建立表比較方便。具體怎樣用ef訪問數據庫,後續會在其他文章中解釋,敬請關註。

1     public class UserInfo
2     {
3         public
int Id { get; set; } 4 public string Name { get; set; } 5 public short Age { get; set; } 6 }
  • DAL層

首先設計通用的CRUD基接口IBaseDal,作為通用的數據庫訪問通道。

1     public interface IBaseDal<T> where T : class,new()
2     {
3         void Add(T entity);
4         void Delete(T entity);
5 void Update(T entity); 6 IQueryable<T> GetEntities(Expression<Func<T, bool>> expression); 7 IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool
>> expression); 8 bool SaveChanges(); 9 }

以UserInfo實體為例,繼承IBaseDal接口

    public interface IUserInfoDal : IBaseDal<UserInfo>
    {

    }

接口設計完成,設計通用基類,這裏存在變化點,本例用ef實現,如果以後通過其他實體框架或者直接通過ado.net訪問數據庫,只需要改動這個類。

    public class BaseDal<T> where T : class,new()
    {
        private DbContext dbContext = DbContextFactory.DbContext;

        public void Add(T entity)
        {
            dbContext.Set<T>().Add(entity);
        }

        public void Delete(T entity)
        {
            dbContext.Entry(entity).State = EntityState.Deleted;
        }

        public void Update(T entity)
        {
            dbContext.Entry(entity).State = EntityState.Modified;
        }

        public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression)
        {
            return dbContext.Set<T>().Where(expression);
        }

        public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression)
        {
            if (isAsc)  //升序
            {
                return dbContext.Set<T>().Where(expression).OrderBy(keySelector).Skip((pageIndex - 1) * pageSize).Take(pageSize);
            }
            else        //降序
            {
                return dbContext.Set<T>().Where(expression).OrderByDescending(keySelector).Skip((pageIndex - 1) * pageSize).Take(pageSize);
            }
        }

        public bool SaveChanges()
        {
            return dbContext.SaveChanges() > 0;
        }
    }
    public static class DbContextFactory
    {
        public static DbContext DbContext
        {
            get
            {
                DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
                if (dbContext == null)
                {
                    dbContext = new ModelContainer();
                    CallContext.SetData("DbContext", dbContext);
                }
                return dbContext;
            }
        }
    }

接下來實現具體的實體數據訪問層,以UserInfoDal為例,其余類似。

    public class UserInfoDal : BaseDal<UserInfo>, IUserInfoDal
    {

    }
  • BLL層

首先像DAL層一樣,定義通用接口。

    public interface IBaseService<T> where T : class,new()
    {
        void Add(T entity);
        void Delete(T entity);
        void Update(T entity);
        IQueryable<T> GetEntities(Expression<Func<T, bool>> expression);
        IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression);
        bool SaveChanges();
    }

通用基類,註意通用基類不需要實現上面的接口

    public class BaseService<T> where T : class,new()
    {
        private BaseDal<T> baseDal = new BaseDal<T>();

        public void Add(T entity)
        {
            baseDal.Add(entity);
        }

        public void Delete(T entity)
        {
            baseDal.Delete(entity);
        }

        public void Update(T entity)
        {
            baseDal.Update(entity);
        }

        public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression)
        {
            return baseDal.GetEntities(expression);
        }

        public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression)
        {
            return baseDal.GetEntitiesByPage(pageSize, pageIndex, isAsc, keySelector, expression);
        }

        public bool SaveChanges()
        {
            return baseDal.SaveChanges();
        }
    }

接下來是UserInfoService

    public class UserInfoService : BaseService<UserInfo>, IBaseService<UserInfo>
    {

    }

至此,所有底層代碼完成,頂層的UI層調用不在贅述了,這裏附上源碼下載地址。

三層架構搭建(asp.net mvc + ef)