• [CAMCOCO][C#]我的系统架构.服务器端.(二)----DATA层


    这一层在园子里有很多很多的介绍了,这层写好之后老胡也没多研究,基本上就是参考的园子里大咖们的写法,具体的说明老胡也细说不了了,把接口和思路简单描述一下就好,如果有问题还是那句话,感谢您不吝赐教,老胡这厢有礼了。

    其实如果您长期逛园子,在很多大咖们的博客里肯定都见过这类似的东西了,不错,我把数据操作提出来了,并且使用了“Migrations”来实现数据库的自动更新。

    一年之前,我还是一个坚定的数据库控,觉得软件开发凡是都得首先去把数据库设计好了。直到用了EF的Code First模式之后,才发现这才是软件设计的终极,当然这只是一家之言,不过Code First的确对面向对象很有帮助,同时在设计Model层的时候,再也不同跳出到数据库层面思考了,所有的外键、关联、索引这些,都是自然而然地就出来了。顺其自然,真的是很爽的一件事,不是么?

    在这套架构中,我甚至把 AutomaticMigrationsEnabled = true; 都开启了,在修改完代码中的实体模型后,只要运行程序,数据库结构都自动更新了,实际上,在用这个模式开发后,我就很少去关心数据表了。

    最后,把IRepository列出来一下,应该就能说清楚本节的重点了,如有疑问,请参考园内大咖的专业文章,老胡就不一一赘述了。

     1  public interface IRepository<T> : IRepositoryForUnitOfWork
     2     {
     3         /// <summary>
     4         /// 新增数据(包含在事务中)
     5         /// </summary>
     6         /// <param name="entity">数据实体类</param>
     7         /// <returns></returns>
     8         void add(T entity);
     9         /// <summary>
    10         /// 更新数据(包含在事务中)
    11         /// </summary>
    12         /// <param name="entity">数据实体类</param>
    13         void update(T entity);
    14         /// <summary>
    15         /// 删除数据:逻辑删除,通过删除标记位实现(包含在事务中)
    16         /// </summary>
    17         /// <param name="entity">数据实体类</param>
    18         void delete(T entity);
    19         /// <summary>
    20         /// 删除数据:逻辑删除,通过删除标记位实现(包含在事务中)
    21         /// </summary>
    22         /// <param name="IdList">数据索引集合:逗号间隔多个索引</param>
    23         void delete(Type ObjectClass, string IdList);
    24         /// <summary>
    25         /// 恢复数据:恢复被逻辑删除的数据
    26         /// </summary>
    27         /// <param name="ObjectClass"></param>
    28         /// <param name="IdList">数据索引集合:逗号间隔多个索引</param>
    29         void recover(Type ObjectClass, string IdList);
    30         /// <summary>
    31         /// 执行SQL语句(包含在事务中)
    32         /// </summary>
    33         /// <param name="SQLCommand">SQL语句</param>
    34         void executeSQL(string SQLCommand);
    35         /// <summary>
    36         /// 判断指定条件的数据是否存在
    37         /// </summary>
    38         /// <param name="whereLambda">查询条件</param>
    39         /// <returns></returns>
    40         bool exists(Expression<Func<T, bool>> whereLambda);
    41         /// <summary>
    42         /// 获得指定的数据实体
    43         /// </summary>
    44         /// <param name="whereLambda">条件参数</param>
    45         /// <returns></returns>
    46         T read(Expression<Func<T, bool>> whereLambda);
    47         /// <summary>
    48         /// 获得符合指定条件的数据条数
    49         /// </summary>
    50         /// <param name="whereLambda">条件参数</param>
    51         /// <returns></returns>
    52         int count(Expression<Func<T, bool>> whereLambda);
    53         /// <summary>
    54         /// 获取符合条件的数据集合
    55         /// </summary>
    56         /// <param name="whereLamdba">条件参数</param>
    57         /// <param name="orderName">排序列名</param>
    58         /// <param name="isAsc">排序方式</param>
    59         /// <returns></returns>
    60         IQueryable<T> readList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);
    61         /// <summary>
    62         /// 获取符合条件的数据集合:实现多个排序定义
    63         /// </summary>
    64         /// <param name="whereLamdba">条件参数</param>
    65         /// <param name="orderName">排序列名</param>
    66         /// <param name="isAsc">排序方式</param>
    67         /// <returns></returns>
    68         IQueryable<T> readList(Expression<Func<T, bool>> whereLamdba, string[] orderName, bool[] isAsc);
    69         /// <summary>
    70         /// 获取符合条件的数据带分页集合
    71         /// </summary>
    72         /// <param name="pageIndex">获取页码</param>
    73         /// <param name="pageSize">页面尺寸</param>
    74         /// <param name="totalRecord">返回:符合条件的数据条数</param>
    75         /// <param name="pageCount">返回:符合条件的数据的页面数量</param>
    76         /// <param name="whereLamdba">条件参数</param>
    77         /// <param name="orderName">排序列名</param>
    78         /// <param name="isAsc">排序方式</param>
    79         /// <returns></returns>
    80         IQueryable<T> readPageList(int pageIndex, int pageSize, out int totalRecord, out int pageCount, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);
    81         /// <summary>
    82         /// 获取符合条件的数据带分页集合:实现多个排序定义
    83         /// </summary>
    84         /// <param name="pageIndex">获取页码</param>
    85         /// <param name="pageSize">页面尺寸</param>
    86         /// <param name="totalRecord">返回:符合条件的数据条数</param>
    87         /// <param name="pageCount">返回:符合条件的数据的页面数量</param>
    88         /// <param name="whereLamdba">条件参数</param>
    89         /// <param name="orderName">排序列名</param>
    90         /// <param name="isAsc">排序方式</param>
    91         /// <returns></returns>
    92         IQueryable<T> readPageList(int pageIndex, int pageSize, out int totalRecord, out int pageCount, Expression<Func<T, bool>> whereLamdba, string[] orderName, bool[] isAsc);
    93     }

    值得一提的是,在这个接口定义中我制作了一个特殊的接口

    void executeSQL(string SQLCommand);

    用于执行直接的SQL语句,说来惭愧,老胡对LINQ TO EF, LINQ TO SQL这些东西理解还是过于浅显,好多复杂的东西要不是实现不了,要不就是觉得实现起来太繁琐,还不如直接来个SQL方便,所以就暴露出来这个接口(当然,老胡自我安慰的说法是:万一哪天有个小弟要用这个框架,没法通过LINQ TO EF来实现操作了,这不还有个后门么,嘿嘿。。。)

    另外,这个架构下,我把所有的删除都做成逻辑删除了,之前的系统中好多都是做的物理删除,最后数据(尤其是什么客户资料啊、订单信息啊)被删后,无限痛苦啊。

    OK,这层就这样吧,真正体现老胡智慧的模型层和业务逻辑层就快出现了,老胡想静静,先。。。

  • 相关阅读:
    java中重载与重写的区别
    Java中数组的初始化方式
    break和continue的区别
    do while 循环和while循环的区别
    Java注释分类
    Java中的switch语句后面的控制表达式的数据类型
    DBA_TABLES之BLOCKS AND EMPTY_BLOCKS
    show_space 脚本
    Linux 6 配置multipath
    环保创业的可行之道——Leo鉴书上66
  • 原文地址:https://www.cnblogs.com/iambluebird/p/4969182.html
Copyright © 2020-2023  润新知