• Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理2


    首先我们来写个类进行获取当前线程内唯一的DbContext

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Linq;
    using System.Runtime.Remoting.Messaging;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        /// <summary>
        /// 当前线程内的数据上下文
        /// </summary>
        public class DbContextFactory {
            /// <summary>
            /// 获取当前线程内的数据上下文,如果当前线程内没有上下文,那么创建一个上下文,
            /// </summary>
            /// <returns>当前线程内的数据上下文</returns>
            public static DbContext GetCurrentDbContext() {
                DbContext currentContext = CallContext.GetData("CurrentDbContext") as DbContext;
                if (currentContext == null) {
                    currentContext = new AuthorDesignContext();
                    CallContext.SetData("CurrentDbContext", currentContext);
                }
                return currentContext;
            }
        }
    }
    View Code

    CallContext 这个类是用来获取当前线程内唯一的数据,可以避免一次性创建出多个数据库上下文。

    接下来是对基础的仓储进行编写(DAL):BaseRepository类

    对数据的增删改查操作

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class BaseRepository<T> where T : class,new() {
    
            public DbContext db = DbContextFactory.GetCurrentDbContext();
    
            /// <summary>
            /// 添加一条记录
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public T AddEntity(T entity) {
                db.Entry<T>(entity).State = EntityState.Added;
                db.SaveChanges();
                return entity;
            }
            /// <summary>
            /// 修改一条记录
            /// </summary>
            /// <param name="entity"></param>
            /// <param name="property">需要修改的字段名称</param>
            /// <returns></returns>
            public bool EditEntity(T entity, string[] property) {
                DbEntityEntry<T> entry = db.Entry<T>(entity);
                entry.State = EntityState.Unchanged;
                foreach (var item in property) {
                    entry.Property(item).IsModified = true;
                }
                return db.SaveChanges() > 0;
                //return true;
            }
            /// <summary>
            /// 删除一条记录
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            public bool DeleteEntity(T entity) {
                DbEntityEntry<T> entry = db.Entry<T>(entity);
                entry.State = EntityState.Deleted;
                return db.SaveChanges() > 0;
                // return true;
            }
            /// <summary>
            /// 查询列表
            /// </summary>
            /// <returns></returns>
            public IQueryable<T> LoadEntities() {
                return db.Set<T>();
            }
            /// <summary>
            /// 查询
            /// </summary>
            /// <param name="whereLamda">查询条件</param>
            /// <returns></returns>
            public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLamda) {
                return db.Set<T>().Where<T>(whereLamda);
            }
            /// <summary>
            /// 对查询结果进行升序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">查询结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            public IOrderedQueryable<T> Order<S>(IQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
                return queryable.OrderBy(orderLamda);
            }
            /// <summary>
            /// 对排序结果再次进行升序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">根据排序条件排序好之后的排序结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            public IOrderedQueryable<T> ThenOrder<S>(IOrderedQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
                return queryable.ThenBy(orderLamda);
            }
            /// <summary>
            /// 对查询结果进行降序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">查询结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            public IOrderedQueryable<T> OrderDesc<S>(IQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
                return queryable.OrderByDescending(orderLamda);
            }
            /// <summary>
            /// 对排序结果再次进行降序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">根据排序条件排序好之后的排序结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            public IOrderedQueryable<T> ThenOrderDesc<S>(IOrderedQueryable<T> queryable, Expression<Func<T, S>> orderLamda) {
                return queryable.ThenByDescending(orderLamda);
            }
            /// <summary>
            /// 对排序结果进行分页操作
            /// </summary>
            /// <param name="queryable">根据排序条件排序好之后的排序结果</param>
            /// <param name="nowNum">跳过序列中指定数量的元素</param>
            /// <param name="pageSize">从序列的开头返回指定数量的连续元素</param>
            /// <returns>指定长度的列表</returns>
            public IQueryable<T> LoadPageEnties(IOrderedQueryable<T> queryable, int nowNum, int pageSize) {
                return queryable.Skip<T>(nowNum + 1).Take<T>(pageSize);
            }
            /// <summary>
            /// 分页查询
            /// </summary>
            /// <typeparam name="S">排序类型</typeparam>
            /// <param name="whereLamda">查询条件</param>
            /// <param name="orderLamda">排序条件</param>
            /// <param name="isDesc">是否倒序</param>
            /// <param name="pageIndex">第几页</param>
            /// <param name="pageSize">页长</param>
            /// <param name="rowCount"></param>
            /// <returns></returns>
            public IQueryable<T> LoadEntities<S>(Expression<Func<T, bool>> whereLamda, Expression<Func<T, S>> orderLamda, bool isDesc, int pageIndex, int pageSize, out int rowCount) {
                var temp = db.Set<T>().Where<T>(whereLamda);
                rowCount = temp.Count();
                if (isDesc)
                    temp = temp.OrderByDescending<T, S>(orderLamda).Skip<T>(pageSize * (pageIndex - 1) + 1).Take<T>(pageSize);
                else
                    temp = temp.OrderBy<T, S>(orderLamda).Skip<T>(pageSize * (pageIndex - 1) + 1).Take<T>(pageSize);
                return temp;
            }
        }
    }
    View Code

    然后管理员类AdminRepository的DAL编写,继承BaseRepository类

    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AdminRepository : BaseRepository<Admin>{
        }
    }
    View Code

    我要做的是面向接口的(虽然没有BLL这层)那么接下来就对IDAL着层来进行编写,

    首先也是IBaseRepository接口

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
    
        public interface IBaseRepository<T> where T : class,new() {
            /// <summary>
            /// 添加一条记录
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            T AddEntity(T entity);
            /// <summary>
            /// 修改一条记录
            /// </summary>
            /// <param name="entity"></param>
            /// <param name="property">需要修改的字段名称</param>
            /// <returns></returns>
            bool EditEntity(T entity, string[] property);
            /// <summary>
            /// 删除一条记录
            /// </summary>
            /// <param name="entity"></param>
            /// <returns></returns>
            bool DeleteEntity(T entity);
            /// <summary>
            /// 查询
            /// </summary>
            IQueryable<T> LoadEntities();
            /// <summary>
            /// 查询
            /// </summary>
            /// <param name="whereLamda">查询条件</param>
            /// <returns></returns>
            IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLamda);
            /// <summary>
            /// 对查询结果进行升序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">查询结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            IOrderedQueryable<T> Order<S>(IQueryable<T> queryable, Expression<Func<T, S>> orderLamda);
            /// <summary>
            /// 对排序结果再次进行升序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">根据排序条件排序好之后的排序结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            IOrderedQueryable<T> ThenOrder<S>(IOrderedQueryable<T> queryable, Expression<Func<T, S>> orderLamda);
            /// <summary>
            /// 对查询结果进行降序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">查询结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            IOrderedQueryable<T> OrderDesc<S>(IQueryable<T> queryable, Expression<Func<T, S>> orderLamda);
            /// <summary>
            /// 对排序结果再次进行降序排序
            /// </summary>
            /// <typeparam name="S">排序字段类型</typeparam>
            /// <param name="queryable">根据排序条件排序好之后的排序结果</param>
            /// <param name="orderLamda">排序表达式</param>
            /// <returns>根据排序条件排序好之后的排序结果</returns>
            IOrderedQueryable<T> ThenOrderDesc<S>(IOrderedQueryable<T> queryable, Expression<Func<T, S>> orderLamda);
            /// <summary>
            /// 对排序结果进行分页操作
            /// </summary>
            /// <param name="queryable">根据排序条件排序好之后的排序结果</param>
            /// <param name="nowNum">跳过序列中指定数量的元素</param>
            /// <param name="pageSize">从序列的开头返回指定数量的连续元素</param>
            /// <returns>指定长度的列表</returns>
            IQueryable<T> LoadPageEnties(IOrderedQueryable<T> queryable, int nowNum, int pageSize);
            /// <summary>
            /// 分页查询
            /// </summary>
            /// <typeparam name="S">排序类型</typeparam>
            /// <param name="whereLamda">查询条件</param>
            /// <param name="orderLamda">排序条件</param>
            /// <param name="isDesc">是否倒序</param>
            /// <param name="pageIndex">第几页</param>
            /// <param name="pageSize">页长</param>
            /// <param name="rowCount"></param>
            /// <returns></returns>
            IQueryable<T> LoadEntities<S>(Expression<Func<T, bool>> whereLamda, Expression<Func<T, S>> orderLamda, bool isDesc, int pageIndex, int pageSize, out int rowCount);
        }
    }
    View Code

    然后管理员接口IAdminRepository 继承IBaseRepository

    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IAdminRepository:IBaseRepository<Admin> {
        }
    }
    View Code

    接下来我们更改下原来的 管理员类AdminRepository的DAL编写,引用了IAdminRepository 的接口

    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AdminRepository : BaseRepository<Admin>, IAdminRepository {
        }
    }
    View Code

    然后对其他Model也进行相同的编写。下面附上代码:

    首先是IDAL,接口这里。

    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IActionToPageRepository : IBaseRepository<ActionToPage> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IAdminLoginLogRepository : IBaseRepository<AdminLoginLog> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IAdminOperationRepository : IBaseRepository<AdminOperation> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IAdminToPageRepository : IBaseRepository<AdminToPage> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IAuthoryRepository : IBaseRepository<Authory> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IAuthoryToPageRepository : IBaseRepository<AuthoryToPage> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IPageActionRepository : IBaseRepository<PageAction> {
        }
    }
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        public interface IPageMenuRepository : IBaseRepository<PageMenu> {
        }
    }
    View Code

    其次是DAL。

    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class ActionToPageRepository : BaseRepository<ActionToPage> ,IActionToPageRepository{
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AdminLoginLogRepository : BaseRepository<AdminLoginLog>, IAdminLoginLogRepository {
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AdminOperationRepository : BaseRepository<AdminOperation>, IAdminOperationRepository {
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AdminToPageRepository : BaseRepository<AdminToPage>, IAdminToPageRepository {
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AuthoryRepository : BaseRepository<Authory>, IAuthoryRepository {
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class AuthoryToPageRepository : BaseRepository<AuthoryToPage>, IAuthoryToPageRepository {
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class PageActionRepository : BaseRepository<PageAction>, IPageActionRepository {
        }
    }
    using AuthorDesign.IDAL;
    using AuthorDesign.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
        public class PageMenuRepository : BaseRepository<PageMenu>,IPageMenuRepository{
        }
    }
    View Code

    然后就是写个专门用来对接WEB层与 DAL与IDAL的类。

    RepositoryEnter 仓储入口,与web层的交互都交由这个类,附上代码

    using AuthorDesign.IDAL;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.DAL {
            /// <summary>
        /// 仓储入口
        /// </summary>
        public class RepositoryEnter:IRepositoryEnter {
            /// <summary>
            /// 统一SaveChange方法
            /// </summary>
            /// <returns></returns>
            public int SaveChange() {
                return DbContextFactory.GetCurrentDbContext().SaveChanges();
    
            }
            /// <summary>
            /// 获取页面与页面动作联系仓储
            /// </summary>
            public IDAL.IActionToPageRepository GetActionToPageRepository { get { return new ActionToPageRepository(); } }
            /// <summary>
            /// 获取管理员登录日志仓储
            /// </summary>
            public IDAL.IAdminLoginLogRepository GetAdminLoginLogRepository { get { return new AdminLoginLogRepository(); } }
            /// <summary>
            /// 获取管理员操作仓储
            /// </summary>
            public IDAL.IAdminOperationRepository GetAdminOperationRepository { get { return new AdminOperationRepository(); } }
            /// <summary>
            /// 获取管理员仓储
            /// </summary>
            public IDAL.IAdminRepository GetAdminRepository { get { return new AdminRepository(); } }
            /// <summary>
            /// 获取管理员与页面仓储
            /// </summary>
            public IDAL.IAdminToPageRepository GetAdminToPageRepository { get { return new AdminToPageRepository(); } }
            /// <summary>
            /// 获取角色仓储
            /// </summary>
            public IDAL.IAuthoryRepository GetAuthoryRepository { get { return new AuthoryRepository(); } }
            /// <summary>
            /// 获取角色与页面仓储
            /// </summary>
            public IDAL.IAuthoryToPageRepository GetAuthoryToPageRepository { get { return new AuthoryToPageRepository(); } }
            /// <summary>
            /// 获取页面动作仓储
            /// </summary>
            public IDAL.IPageActionRepository GetPageActionRepository { get { return new PageActionRepository(); } }
            /// <summary>
            /// 获取页面仓储
            /// </summary>
            public IDAL.IPageMenuRepository GetPageMenuRepository { get { return new PageMenuRepository(); } }
        }
    }
    View Code

    IRepositoryEnter接口

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorDesign.IDAL {
        /// <summary>
        /// 仓储入口
        /// </summary>
        public interface IRepositoryEnter {
            /// <summary>
            /// 统一SaveChange方法
            /// </summary>
            /// <returns></returns>
            int SaveChange();
            /// <summary>
            /// 获取页面与页面动作联系仓储
            /// </summary>
            IDAL.IActionToPageRepository GetActionToPageRepository { get; }
            /// <summary>
            /// 获取管理员登录日志仓储
            /// </summary>
            IDAL.IAdminLoginLogRepository GetAdminLoginLogRepository { get; }
            /// <summary>
            /// 获取管理员操作仓储
            /// </summary>
            IDAL.IAdminOperationRepository GetAdminOperationRepository { get; }
            /// <summary>
            /// 获取管理员仓储
            /// </summary>
            IDAL.IAdminRepository GetAdminRepository { get; }
            /// <summary>
            /// 获取管理员与页面仓储
            /// </summary>
            IDAL.IAdminToPageRepository GetAdminToPageRepository { get; }
            /// <summary>
            /// 获取角色仓储
            /// </summary>
            IDAL.IAuthoryRepository GetAuthoryRepository { get; }
            /// <summary>
            /// 获取角色与页面仓储
            /// </summary>
            IDAL.IAuthoryToPageRepository GetAuthoryToPageRepository { get; }
            /// <summary>
            /// 获取页面动作仓储
            /// </summary>
            IDAL.IPageActionRepository GetPageActionRepository { get; }
            /// <summary>
            /// 获取页面仓储
            /// </summary>
            IDAL.IPageMenuRepository GetPageMenuRepository { get; }
        }
    }
    View Code

    对DAL于IDAL的一些编写就到这里,我感觉自己讲的很乱,好像没有什么主次之分。如果各位又不懂的或者感觉那里错了的,还请告诉我。

    百度源码下载地址

  • 相关阅读:
    jquery常用获取属性的方法有哪些(attr prop区别)
    Java中 List、Set、Map 之间的区别
    mysql查询语句where后面加if判断
    mysql if 排序_MySQL ORDER BY IF() 条件排序
    Java 如何逆向遍历一个 List
    解决java.util.concurrent.RejectedExecutionException(Java多线程问题)
    list,map,set的区别
    Java8 List去掉重复对象以及保证添加顺序
    java 常用的几种集合类总结
    浅析Pinia的简单使用
  • 原文地址:https://www.cnblogs.com/yjq-code/p/AuthoryDesign3.html
Copyright © 2020-2023  润新知