Mvc.Ext.Net项目架构(一)
我在一家小型的私企工作,去年的营业额相当的差,今年年初公司要求各部门自行走人。哎靠,这就意味着没有补贴就要我们走人,公司太不仗义了。哎仔细想想哪个公司老板都会考虑自己的利益,没办法。在一家公司瞎混还不如找一个新的挑战,我本来已经找到一家电子商务公司(北迈),工资还可以而且还不用交税,就当是福利了,最主要的是离家很近啊就在四惠,面试当天就给了我offer,那心情是一个大好啊!但是意外情况出现了,由于在去年部门经理交给我一个项目,客户那边的人跟公司领导说我不可以离开公司,必须要继续跟进这个项目,其实之前我也不知道是客户的要求,我只是提交了离职然后还提了留下了条件,本来满心希望的要离开了,因为已经同意北迈去入职了。可是公司居然很爽快的答应了我的要求,我自己都没有想到。最后没办法只能是硬着头皮跟北迈解释“自己不能过去了希望以后还有机会合作”。不过我们部门的形式是一片大好,签了几个单子,最近公司忙着上新三板,已经找到一个投资公司给公司注资。其实这些都是废话,我想说的就是这个项目。
我们公司做的是一个档案项目,给客户做的当前也是档案项目,当然公司里面也有已经成熟的项目,但是由于公司的销售和项目人员设下的一个大坑(当然我不是说他们怎么样,大家都是为了自己的利益)让我们研发来填,没办法我们就是填坑的。按照客户的需求我们的产品都不符合客户的需求,客户是一所大学的老师,估计是他比较懂吧。没办法经过部门领导和同事的协商决定有开发一个版本,就当是高校版本了,最后经理让我来负责这个项目,本来原来是另外一个女同事在原来项目上进行修改。
根据需求,数据库还得分库,数据的展示还需要分为主数据、子数据和详细数据,需要选择某个子系统进入不同的系统...等等一堆乱七八糟的需求。经过我和经理的商量最终决定不使用Silverlight,在整个项目中使用Mvc.Ext.net,MVC,数据库用sql server 2008R2,Mongo(用来存储附件),由于对Mvc.Ext.net不是很熟悉,前期研究这个Mvc.Ext.net就花了很长时间而且有些特别简单的也会花一天的时间研究,因为这个插件用的人少网上也很难找个别人的经验总结,后面会把遇到的问题列出一些。经理只和我确定了这些技术,当然还有别的,但是真个架构让我自己来搭建,我勒个去,虽然我写了几年的代码 ,但是我还从来没有搭建过任何一个完成的项目。从网上找了很多的资料,感觉都不符合或者有些复杂,最后我就用上了动软那套框架,哎,其实我写这篇博客就是希望能得到各位大虾的帮助能给我多多的指点,希望你们使劲喷,我脸皮厚没事。
下面的截图是我一个框架图
这是最简单的三层架构了,Lib是我放主要的DLL文件的地方,Core是咱们通常的DBHelper里面有链接SQL server,oracle等数据库,其实根据我当前的数据库,因为有分库,所以在写链接数据库时我做了一个代码处理,类似一个工厂吧但是没有那么先进,字符串代表不同的字库。在进入某个子系统只需要传一个字符串就能知道当前进入的是哪一个子系统。
1 public static string GetSubsSystemConStr(string subsName) 2 { 3 switch (subsName) 4 { 5 case "BaseArchSys": 6 return ConfigurationManager.AppSettings["FoxSystem-JJConnStr"]; 7 8 case "ScientificResearch": 9 10 return ConfigurationManager.AppSettings["FoxSystem-KYConnStr"]; 11 case "KindArchSys": 12 13 return ConfigurationManager.AppSettings["FoxSystem-SWConnStr"]; 14 case "SoundImage": 15 16 return ConfigurationManager.AppSettings["FoxSystem-SXConnStr"]; 17 case "OverallArchSys": 18 19 return ConfigurationManager.AppSettings["FoxSystem-ZHConnStr"]; 20 case "PhotoArchSys": 21 22 return ConfigurationManager.AppSettings["FoxSystem-ZPConnStr"]; 23 case "workflow": 24 25 return ConfigurationManager.AppSettings["foxsystem-workflow"]; 26 default: 27 return ConfigurationManager.AppSettings["FoxSystemConnStr"]; 28 } 29 }
下图为不同子系统的点击图片,不知道这样是否合理,还请大虾指点。
我的数据库持久层没有使用任何的Orm,原来本来是想使用但是感觉还是最原始的在效率上会更好,使用更加简单一点。虽然在数据量来说不是很大但是为了让其他的同事和时间上的考虑就没有用。在数据的显示上我使用了存储过程,这个存储过程不是我写的,因为我写的还没有这个好用,所以我就偷懒了一次直接拿过来用了代码:
1 CREATE PROCEDURE [dbo].[proc_ListPage] 2 ( 3 @tblName nvarchar(max), ----要显示的表或多个表的连接 4 @fldName nvarchar(2000) = '*', ----要显示的字段列表 5 @pageSize int = 10, ----每页显示的记录个数 6 @page int = 1, ----要显示那一页的记录 7 @pageCount int = 1 output, ----查询结果分页后的总页数 8 @Counts int = 1 output, ----查询到的记录数 9 @fldSort varchar(500) = null, ----排序字段列表或条件 10 @Sort bit = 1, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 11 @strCondition varchar(max) = null, ----查询条件,不需where 12 @ID varchar(100), ----主表的主键 13 @Dist bit = 0 ----是否添加查询字段的 DISTINCT 默认0不添加/1添加 14 ) 15 AS 16 SET NOCOUNT ON 17 Declare @strTmp nvarchar(max) ----存放取得查询结果总数的查询语句 18 Declare @strSortType nvarchar(10) ----数据排序规则A 19 Declare @strFSortType nvarchar(10) ----数据排序规则B 20 Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造 21 Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造 22 DEclare @lastSort nvarchar(50) ----最后一个排序字段 23 24 if @Dist = 0 25 begin 26 set @SqlSelect = 'select ' 27 set @SqlCounts = 'Count(*)' 28 end 29 else 30 begin 31 set @SqlSelect = 'select distinct ' 32 set @SqlCounts = 'Count(DISTINCT '+@ID+')' 33 end 34 35 if @Sort=0 36 begin 37 set @strFSortType=' ASC ' 38 set @strSortType=' DESC ' 39 end 40 else 41 begin 42 set @strFSortType=' DESC ' 43 set @strSortType=' ASC ' 44 end 45 46 --------生成查询语句-------- 47 --此处@strTmp为取得查询结果数量的语句 48 if @strCondition is null or @strCondition='' --没有设置显示条件 49 begin 50 set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName 51 end 52 else 53 begin 54 set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition 55 end 56 57 --截取最后一个排序字段 58 set @lastSort = case when charindex('.',@fldSort)>0 then SUBSTRING(@fldSort,charindex('.',@fldSort)+1,LEN(@fldSort)) else @fldSort end 59 60 --获取排序字段 61 62 ----取得查询结果总数量----- 63 exec sp_executesql @strTmp,N'@Counts int out ',@Counts out 64 declare @tmpCounts int 65 if @Counts = 0 66 set @tmpCounts = 1 67 else 68 set @tmpCounts = @Counts 69 70 --取得分页总数 71 set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize 72 --加入总条数 73 set @fldName=@fldName+',' + CAST(@Counts as VARCHAR(20)) + ' as TotalNumber' 74 /**//**当前页大于总页数 取最后一页**/ 75 if @page>@pageCount 76 set @page=@pageCount 77 78 --/*-----数据分页2分处理-------*/ 79 declare @pageIndex int --总数/页大小 80 declare @lastcount int --总数%页大小 81 82 set @pageIndex = @tmpCounts/@pageSize 83 set @lastcount = @tmpCounts%@pageSize 84 if @lastcount > 0 85 set @pageIndex = @pageIndex + 1 86 else 87 set @lastcount = @pagesize 88 --//***显示分页 89 if @strCondition is null or @strCondition='' --没有设置显示条件 90 begin 91 begin 92 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName 93 +' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 94 +' order by '+ @fldSort +' '+ @strFSortType+')' 95 +' order by '+ @fldSort +' '+ @strFSortType 96 end 97 end 98 else --有查询条件 99 begin 100 begin 101 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName +' from '+@tblName 102 +' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName 103 +' Where (1>0) ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType+')' 104 +' ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType 105 end 106 end 107 print @strTmp 108 ------返回查询结果----- 109 exec sp_executesql @strTmp 110 ---print @strTmp 111 SET NOCOUNT OFF 112 ----------------------------------更新分页的------------------------------- 113 114 115 116 GO
当然在文件存储过程中使用的mongo数据库,mongo我没有特别详细的去研究,我只拿来使用了,非常缺乏理论知识。
未完待续....