NToggery 开发之旅(01) – 程序架构
项目名称:NToggery
项目简介:服装进销存基础平台
程序版本:2.2.61111
作者:Clark Chan
博客:http://clarkchan.cnblogs.com/
运行环境:Microsoft Visual Studio 2005,Microsoft SQL Server 2000。
NToggery名称含义:N多服装店都选用的,基于.NET Framework的服装进销存基础平台。(N多,就是很多的意思)。
引言:
首先祝单身的朋友,节日快乐!最近园子里的热门话题是开源软件。我以前也打算做一个开源项目,让大家的智慧聚焦在项目上,产生头脑风暴。最近仔细学习了几个开源的例子后,觉得:
1,我的代码还没有达到开源软件的实力。(代码无实力)
2,我自己还不具备完整的开源基础知识。(开源知识基础差)
3,我也没有良好的开源软件的环境和条件。(开源的方式不明)
如果我做开源软件,却不能满足她的标准。项目质量就难以保证。综合很多客观因素,决定暂时放弃开源软件的做法(等聚集一些实力后,再做成开源软件)。现在通过NToggery开发之旅的方式,提供一个平台,公开源代码和设计思路。和大家一起学习,共同积累。请大家多多指教,欢迎提出Bug和建议。
正文:
现在通过一个Sample说明NToggery商业需求的解决方案思路:1、 NToggery2数据库中的表结构:
数据库中有一张表“Staff”:
PrimaryKey |
StaffId |
int |
4 |
Not NULL |
|
StaffName |
varchar |
50 |
Not NULL |
另外一张表“Demo”:
PrimaryKey |
DemoId |
int |
4 |
Not NULL |
|
DemoName |
varchar |
50 |
Not NULL |
|
ListPrice |
decimal |
9 |
|
|
Quantity |
int |
4 |
Not NULL |
ForeignKey |
CreatedStaffId |
int |
4 |
Not NULL |
|
CreatedDate |
datetime |
8 |
Not NULL |
ForeignKey |
ModifiedStaffId |
int |
4 |
Not NULL |
|
ModifiedDate |
datetime |
8 |
Not NULL |
|
IsValid |
bit |
1 |
Not NULL |
很明显这里的关系是:Demo表中的CreatedStaffId、ModifiedStaffId字段的值来自Staff表中的StaffId。
还有一个关系就是Demo表中有一个唯一性约束IX_Demo:表示DemoName字段不能重复。
2、 现在我们来定义Demo表的数据商业规则以及数据访问的SQL逻辑:
(1) 添加的时候:
DemoId为表中最大数加一,由存储过程dbo.usp_NewId得到。日期字段ModifiedDate = CreatedDate取自服务器的时间getdate()方法,即修改时间等于创建时间。ModifiedStaffId = CreatedStaffId 取自界面的输入,即修改人等于创建人。DemoName、ListPrice、Quantity取自界面的输入。IsValid=1代表插入的记录有效
所以添加的时候,输入参数只有4个(@DemoName,@ListPrice,@Quantity,@CreatedStaffId)。在这里我采用存储过程进行Insert(参见存储过程:dbo.usp_Demo_Insert)
(2) 删除的时候:
我们商业要求是不能物理删除记录,老板需要查看什么人在什么时候,删除了哪条记录。DemoId取自界面的输入。这里我们的方法是用Update语句将IsValid 写为0,代表该记录已经删除。删除的时候应该要记录删除人,这里我遗漏了,sorry,只能下次修改了。删除时间应该写在字段ModifiedDate=getdate()。
所以删除的时候,输入的参数应该有2个(@DemoId、@ModifiedStaffId漏掉了sorry~~!)。
在这里我采用存储过程dbo.usp_Demo_Delete。
(3) 修改的时候:
取自界面的字段是:DemoId、DemoName、ListPrice、Quantity、ModifiedStaffId。修改时间ModifiedDate=getdate()。这里要提一下:由于Demo表中有一个唯一性约束IX_Demo,所以我们在添加,和修改的存储过程中可以添加效验判断,排除添加重复的DemoName。
所以修改的时候,输入的参数应该有5个(@DemoId,@DemoName,@ListPrice,@Quantity,@ModifiedStaffId)。这里我采用存储过程dbo.usp_Demo_Update。
(4) 查询的时候:
通常查询的时候我们有2种商业需求。查询主键的那条记录和以一定的条件查询多条记录。在这里我用了2个存储过程去实现:dbo.usp_Demo_SelectOne、dbo.usp_Demo_SelectAll。
我们把它称为查看一条记录(View)和查询多条记录(Query)。
所以View的时候,输入的参数只有1个(@DemoId)。
Query的时候可以有有限的多个参数:(@DemoId, @DemoName, @ListPrice, @Quantity, @CreatedStaffId, @CreatedDate, @CreatedDateBegin, @CreatedDateEnd, @ModifiedStaffId, @ModifiedDate, @ModifiedDateBegin, @ModifiedDateEnd, @IsValid, @CreatedStaffName, @ModifiedStaffName)注意上面4个紫罗兰颜色的参数,是多余的,用来区间查询时间的,可以不要。(如:查询创建时间大于等于
(5) 关于多表关联的查询:
商业需求上,用户在界面能看到的只能是员工名称StaffName,老板不能理解1=“张三”,2=“李四”。于是查询SQL语句是:
SELECT a.DemoId, a.DemoName, a.ListPrice, a.Quantity, a.CreatedStaffId
,a.CreatedDate, a.ModifiedStaffId, a.ModifiedDate, a.IsValid
,b.StaffName AS CreatedStaffName
,c.StaffName AS ModifiedStaffName
FROM Demo a
LEFT OUTER JOIN Staff b ON a.CreatedStaffId = b.StaffId
LEFT OUTER JOIN Staff c ON a.ModifiedStaffId = c.StaffId
在存储过程dbo.usp_Demo_SelectOne、dbo.usp_Demo_SelectAll中都可以看到。
3、 至此5个存储过程就完成了,她们能解决一个特定的商业逻辑需求了。这里通过存储过程将SQL语句封装有几个好处:第一,她封装了部分不需要给程序处理的字段如:ModifiedDate=getdate(),等。第二,将SQL语句变成存储过程,可以自定义查询关联表,灵活的修改。如:添加的时候定义有效IsValid=1。第三,程序变的简单,每个方法的作用就是执行一个存储过程,相当于存储过程的数据访问方法的映射。如:SQLServerDAL中的5个方法
public void Insert(DemoModel demoModel)