• 依赖接口编程


    //分层的思想:模块内部之间高内聚,模块外部之间低耦合
    //当遇到跨数据库时候,数据库访问驱动层就会产生变化,就会直接影响采用高耦合使用该层的的代码块
    //解决模块间高耦合的状况思路:利用接口或者抽象类来进行隔离,不再依赖具体的类的实现(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()

  • 相关阅读:
    JAVA程序员必看的面试题
    百度技术研发笔试题目
    IBM-JAVA面试题
    .net 面试题系列文章二(附答案)
    Reactive Extensions简介一
    不用恢复出厂设置删除google账户的方法
    如何通过使用64位版本 Windows 查看系统注册表
    Google Goggles的图像识别很好很强大
    实现类似IE的松散耦合(LooselyCoupled )效果——Window Tabifier
    C#的二维码生成和解析
  • 原文地址:https://www.cnblogs.com/it-xcn/p/5746353.html
Copyright © 2020-2023  润新知