这一层在园子里有很多很多的介绍了,这层写好之后老胡也没多研究,基本上就是参考的园子里大咖们的写法,具体的说明老胡也细说不了了,把接口和思路简单描述一下就好,如果有问题还是那句话,感谢您不吝赐教,老胡这厢有礼了。
其实如果您长期逛园子,在很多大咖们的博客里肯定都见过这类似的东西了,不错,我把数据操作提出来了,并且使用了“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,这层就这样吧,真正体现老胡智慧的模型层和业务逻辑层就快出现了,老胡想静静,先。。。
- 4楼DownUp
- 推荐顶
- 3楼xiaocong_soft
- 关注
- 2楼wangzhefeng
- 关注中
- 1楼汉卿
- 问下 IRepositorylt;Tgt; 这叫什么架构?好处是什么?
- Re: 胡搅蛮缠
- @汉卿,引用问下 IRepositorylt;Tgt; 这叫什么架构?好处是什么?,就是一个数据仓储,利用了泛型来实现,在业务层里不同聚合操作不同实体时,将实体类型传入T构造出针对该实体的数据仓储操作对象,就具备CURD的操作接口及相应功能了,那么我们就不用再针对每个实体写具体的CURD实现过程,代码也就抽离出来公用了。,,例如:,IRepositorylt;Organizationgt; res = createRepositorylt;Organizationgt;();,那么我们就创建好一个Organization的仓储操作对象,也就可以实现add/update/delete/find等等一系列操作了,而具体的curd操作代码均可以通过泛型函数来实现,不用专门针对Organization写一份了。