Mine.Net

 

关于ASP.Net的导入导出(3)

Com.urp.command.FileFrameWork3

时间过的好快,距离上一篇文章又过了一个星期了,工作依旧忙忙碌碌,项目依旧浑浑噩噩,看不清未来。不说这些了,还是说说自己写的东东吧。上周一直没交出新的文章上来,其实不是自己不想写,随着设计的进行,考虑的东西越来越多了,结果自己没做过的东西也越来越多。很多需要先写一下,看看实现某个功能该大致如何设计,然后再重构,呵呵,有一点极限编程的味道了;其实从另一个侧面说明了经验的不足。

这一周,整个结构改变比较大。为了同时支持DataSet,Collection, 平白无故多出来一层。因为.Net中的DataSet,微软并没有让它来继承IList接口,换句话说没有办法来将它和Collection规范到一起,所以只能多写一个IdataAdapter接口,用对象适配器把DataSetCollection包装一下,貌似问题得以解决。(DataSetDataTable都有继承一个IlistSource的接口,向对象提供返回可以绑定到数据源列表的功能,好象多少和Ilist有点关系,实际用途没有,网上的文章涉及的也不多)

IdataAdapter相关的类图如下:



    DataAdapterFactory
是一个简单工厂,通过一个调用一个静态方法来,返回需要实例化的IdataAdapter名字来实例化IdataAdapterCollectionAdapter包含一个ModelCollection,ModelCollection继承CollectionBase.每一行记录一个ModelDataTableAdapter包含一个DataTableArrayAdapter包含一个object[]数组,针对三种不同的持久层。应该说用DataTable实现的要相对容易一些,很多的操作就相当于一个简单的数据库查询,直接FillDataTable就可以了。CollectionAdapter相对要复杂一些,需要实现自己的数据结构,要模仿DataTable建立Row,Column,并要求用户程序有自己的Model层,对每个私有字段提供get,set属性,通过属性完成Fill。不过在效率上DataTableAdapter可能是最好的,因为是一次性读入的,只要访问一次文件,而很多时候CollectionAdapter需要一行一行的读取文件的数据。

这样子改变以后IdataAdapter主要是负责数据的持久化,负责数据保存,从文件中把数据读入内存,最后导入数据库的时候,我们只需要获得IdataAdapter就可以了,而这个读的过程就用IFileAPI完成。

ImportFileFrame,ExportFileFrame的类图如下:



    增加了一个AbstractFileFrame的抽象类。文件的打开,关闭,等都提到这个类里,方便以后的重用。我们期望在ImportFileFrame,ExportFileFrame中的Import,Export都用模板方法实现,例如:

 

protected void Import()
{
    
try{
    ProcessFile();    
//保存临时文件到服务器
    OpenFile();    //打开文件
    ImportCheck();    //导入校验
    Import();    //导入
         DeleteFile();    //删除临时文件
}
    
catch(Exception ex){
    }
    
finally{
    CloseFile();    
//关闭文件
     }
}


    到目前位置,四个主要Frame类基本上都形成了,从ImportFileFrame,ExportFileFrame的改变来看,未对前两个Frame造成过多影响,说明我们的功能设计还是比较成功的。这里需要说明的是对于IFileAPI的创建,和之前的有些不同,因为考虑到实现CollectionAdapter,DataTableAdapter后,文件的读取,数据的读入内存在方式上存在不同,所以,有可能到最好需要在建立另一组从IFileAPI继承的类,而且他们的实例化工厂要有IdataAdapter 决定,就暂时先这样考虑着吧。


    由此,导入的序列图如下:

 

posted on 2006-07-10 19:41  whoisyorudady  阅读(2250)  评论(0编辑  收藏  举报

导航