马上要毕业了,心里很迷茫,感觉真的时间飞逝,软件真的博大精深,特别.NET平台在Microsoft下变化之迅猛,个人总是赶不上技术的日新月异。哎,希望自己能早日走上设计之路。
闲来无事便根据自己大学四年项目实践经验,想实现一些常用模块的抽象和集成。考虑了一下觉得先该从分页查询入手,便简单的设计了下,现目前版本实现了单表的基本分页查询。我知道已经有很多前辈做了这个,本人设计能力和前辈们比那就欠缺多了,有那里不足的望指出,大家共同进步。
下载代码:WolfPager下载
主要采用工厂模式创建实现了PageSqlBase的对象,然后可以利用对象的GetSql()方法返回查询Sql语句。我的目的是生成sql语句并非直接从数据库取得数据,因为我认为如果这样将会增加耦合度增加,不易于移植通用,也不与分页控件结合,于是为了降低耦合度,我认为分页控件的职责是UI的显示而并非分页算法等的处理,更非数据的读取。
1.VS类图为:
2其中PageSqlBase抽象类为:
代码 1 namespace Wolf.Pager 2 { 3 public abstract class PageSqlBase 4 { 5 //查询信息 6 public SearchInfo SearchInfo 7 { 8 get; 9 set; 10 } 11 //Page信息 12 public PageInfo PageInfo 13 { 14 get; 15 set; 16 } 17 public abstract string GetSql(); 18 } 19 } 20
3 我在类库实现了多种分页算法,网上到处都有算法的描述,在这里我就不讲解了。只展示一下针对SqlServer低版本(2000)的分页算法选择类,因他的算法用Top并且不同的算法针对不同的主键和排序形式,为了效率的优化故应该选择不同的算法。它采用的适配器的方式实现的。
代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Wolf.Pager 7 { 8 public class SQLServerLowerLevelPageSql:PageSqlBase 9 { 10 public override string GetSql() 11 { 12 if (PageInfo == null || SearchInfo == null) 13 { 14 throw new ArgumentNullException("Page信息和Search信息不能为空!"); 15 } 16 return PageSqlChoise().GetSql(); 17 } 18 19 protected virtual PageSqlBase PageSqlChoise() 20 { 21 if (SearchInfo.UniqueFieldCollection != null) 22 { 23 if (SearchInfo.UniqueFieldCollection.Count == 1) 24 { 25 if (SearchInfo.OrderExpress != null) 26 { 27 if (SearchInfo.OrderExpress.Count == 1 && SearchInfo.OrderExpress[0].Filed.ToLower() 28 .Equals(SearchInfo.UniqueFieldCollection[0].Name.ToLower())) 29 {//单键唯一排序字段 30 return InitPageSql(new TOPMAXPageSql()); 31 } 32 else// 单键多排序 33 { 34 return InitPageSql(new TOPMutilpOrderPageSql()); 35 } 36 } 37 else//单键无排序(默认键值排序) 38 { 39 return InitPageSql(new TOPMAXPageSql()); 40 } 41 } 42 else//联合(多)键 43 { 44 return InitPageSql(new TopMutilpKeyPageSql()); 45 } 46 } 47 else if (SearchInfo.OrderExpress != null && SearchInfo.OrderExpress.Count > 0) 48 //无键(联合建作为排序字段)//设计时把联合建作为了排序字段 49 { 50 return InitPageSql(new TopMutilpKeyPageSql()); 51 } 52 else 53 { 54 throw new ArgumentNullException("Page信息和Search信息不能为空!"); 55 } 56 57 } 58 59 private PageSqlBase InitPageSql(PageSqlBase psb) 60 { 61 psb.SearchInfo = SearchInfo; 62 psb.PageInfo = PageInfo; 63 return psb; 64 } 65 } 66 } 67 68 69
4
我的测试配置Configu为:<?xml version="1.0" encoding="utf-8" ?><configuration> <appSettings> <add key="DataBaseType" value="SQLServerLowerLevel"/> <!--<add key="Assembly" value="ConsoleTest"/> <add key="NameSpace" value="ConsoleTest"/> <add key="Type" value="Program"/>--> </appSettings></configuration>测试结果性能比较高效,具体大家把代码下载看。 本版本只是一个初步的实践摸索版本,离使用还应该差一些,我会有时间在改进,主要应该还要加入:1:多表查询的分页方式。2:GroupBy分组统计方式的分页查询。3:添加是内存数据统计的类库。4:缓存机制的加入(初步打算用OS的页面置换算法LRU(最近最少使用),加入超时减少缓存带来的数据不一致性)。 分页控件的设计暂时没考虑太多,我认为Web控件应该可以支持URl、PoatBack、Ajax三种方式,具体实现可以用简单工厂。Winform的当然就一种方式了。数据库处理应该有程序员了事件代码中挂载。UI和BL层必须与数据层相隔离。 希望能先多开发些常用模块,减少以后的代码量,加快开发速度。我的目标是能开发一个小型管理系统的通用开发和配置平台。
: 工厂类的实现方式代码如下: