依赖接口编程
 //分层的思想:模块内部之间高内聚,模块外部之间低耦合
    //当遇到跨数据库时候,数据库访问驱动层就会产生变化,就会直接影响采用高耦合使用该层的的代码块
    //解决模块间高耦合的状况思路:利用接口或者抽象类来进行隔离,不再依赖具体的类的实现(new xxx)
依赖接口编程:
        //UserInfoDal userInfoDal = new UserInfoDal();  //这种直接new出DAL层的内容是一种高耦合,只要DAL层的类发生变化这里也会受到很多影响
        //所以不应该依赖【UserInfoDal userInfoDal = new UserInfoDal()】这种方法,而是依赖【UserInfo的接口:IUserInfo】
        //依赖接口的做法:IUserInfoDal userInfoDal = new UserInfoDal(),这样字不管实例怎么变化,接口是不会变化的,而UserInfoDal是实现了接口IUserInfoDal
        //IUserInfoDal userInfoDal =new UserInfoDal();//依赖接口编程,所有实现接口的类都遵从接口的规范约束
(1)基类接口:
namespace My.OA.IDal
{
    //只要跨层跨模块,就一定要用接口进行隔离,哪怕这个接口没有意义,层与层之间必须依赖接口不是依赖具体的实现
    //职责:数据库访问层接口基类
    public interface IBaseDal<T> where T:class ,new()
    {
         bool AddEntityInfo(T TModel);  //接口的方法默认是Ppublic的,不需要方法实体
        //删
         bool DeleteEntityInfo(T TModel);//实现了接口的类,必须实现它的方法,这样就形成一种约束规范,只要实现了这个接口的类都有这个接口的同名方法。实现接口方法:public bool DeleteEntityInfo(T TModel){}
        //改
        bool UpEntityInfo(T TModel);       
        //查
        IQueryable<T> GetEntityInfo(Expression<Func<T,bool>> whereLambda);        
        //分页
        IQueryable<T> GetPagingEntityInfo<s>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, s>> orderLambda, bool isDesc);        
    }
}
(2)实现基类接口:
    public interface IUserInfoDal:IBaseDal<UserInfo>//实现公共方法接口
    {       
    }
(3)基类;
/// <summary>
    /// 职责:封装所有DAL公共的方法
    /// 类的职责要单一
    /// </summary>
    public class BaseDal<T> where T:class ,new () 
    {
        //Entities myEntities = new Entities();
        //这是一种依赖抽象编程,不是依赖具体的实例,能用抽象编程的地方就尽量用,做到维护性最好
        public DbContext myEntities
        {
            get { return DataBaseContextFactory.GetDataTabelContext(); }
        }
        //增 
        public bool AddEntityInfo(T TModel) 
        {
            myEntities.Set<T>().Add(TModel);
            //if (myEntities.SaveChanges() > 0)
            //{
            //    return true;
            //}
            //else 
            //{
            //    return false;
            //}
            return true;
        }
        //删
        public bool DeleteEntityInfo(T TModel) 
        {
            myEntities.Entry<T>(TModel).State = EntityState.Deleted;
            //if (myEntities.SaveChanges() > 0)
            //{
            //    return true;
            //}
            //else 
            //{
            //    return false;
            //}
            return true;
        }
        //改
        public bool UpEntityInfo(T TModel) 
        {
            myEntities.Entry<T>(TModel).State = EntityState.Modified;
            //if (myEntities.SaveChanges() > 0)
            //{
            //    return true;
            //}
            //else 
            //{
            //    return false;
            //}
            return true;
        }
        //查
        public IQueryable<T> GetEntityInfo(Expression<Func<T,bool>> whereLambda) 
        {
            //Set<T>()根据泛型T在上下文返回一个DBset实例
            return myEntities.Set<T>().Where(whereLambda).AsQueryable();
        }
        //分页
        public IQueryable<T> GetPagingEntityInfo<s>(int pageSize, int pageIndex, out int total, Expression<Func<T, bool>> whereLambda, Expression<Func<T, s>> orderLambda,bool isDesc) 
        {
            //s是方法泛型,约束排序的类型
            total = myEntities.Set<T>().Where(whereLambda).Count();
            if (isDesc)
            {
                var temp = myEntities.Set<T>().Where(whereLambda).OrderByDescending<T, s>(orderLambda).Skip(pageSize * (pageIndex - 1)).Take(pageSize);
                return temp;
            }
            else 
            {
                var temp = myEntities.Set<T>().Where(whereLambda).OrderBy<T, s>(orderLambda).Skip(pageSize * (pageIndex - 1)).Take(pageSize);
                return temp;
            }
        }
    }
实现基类和接口:
    public class UserInfoDal:BaseDal<UserInfo>,IUserInfoDal------这样BaseDal<UserInfo>就对接口的方法进行隐式重写了
    {
    }
面向接口编程
IUserInfoDal userInfoDal = new UserInfoDal()
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号