现在的位置: 首页 > 综合 > 正文

NToggery 开发之旅(01) – 程序架构

2011年09月26日 ⁄ 综合 ⁄ 共 3248字 ⁄ 字号 评论关闭

NToggery 开发之旅(01) – 程序架构

 

项目名称:NToggery

项目简介:服装进销存基础平台

程序版本:2.2.61111

作者:Clark Chan

博客:http://clarkchan.cnblogs.com/

邮箱:taeheesoft#163.com

运行环境:Microsoft Visual Studio 2005Microsoft 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表中的CreatedStaffIdModifiedStaffId字段的值来自Staff表中的StaffId

还有一个关系就是Demo表中有一个唯一性约束IX_Demo:表示DemoName字段不能重复。

 

2、  现在我们来定义Demo表的数据商业规则以及数据访问的SQL逻辑:

 

(1)       添加的时候:

DemoId为表中最大数加一,由存储过程dbo.usp_NewId得到。日期字段ModifiedDate = CreatedDate取自服务器的时间getdate()方法,即修改时间等于创建时间。ModifiedStaffId = CreatedStaffId 取自界面的输入,即修改人等于创建人。DemoNameListPriceQuantity取自界面的输入。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)       修改的时候:

取自界面的字段是:DemoIdDemoNameListPriceQuantityModifiedStaffId。修改时间ModifiedDate=getdate()。这里要提一下:由于Demo表中有一个唯一性约束IX_Demo,所以我们在添加,和修改的存储过程中可以添加效验判断,排除添加重复的DemoName

 

所以修改的时候,输入的参数应该有5个(@DemoId,@DemoName,@ListPrice,@Quantity,@ModifiedStaffId)。这里我采用存储过程dbo.usp_Demo_Update

 

(4)       查询的时候:

通常查询的时候我们有2种商业需求。查询主键的那条记录和以一定的条件查询多条记录。在这里我用了2个存储过程去实现:dbo.usp_Demo_SelectOnedbo.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个紫罗兰颜色的参数,是多余的,用来区间查询时间的,可以不要。(如:查询创建时间大于等于2006-10-1,小于2006-10-31的记录)关于存储过程dbo.usp_Demo_SelectAll的详细解释大家可以参考随笔http://www.cnblogs.com/ClarkChan/archive/2006/10/18/532565.html

 

(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_SelectOnedbo.usp_Demo_SelectAll中都可以看到。

 

 

3、  至此5个存储过程就完成了,她们能解决一个特定的商业逻辑需求了。这里通过存储过程将SQL语句封装有几个好处:第一,她封装了部分不需要给程序处理的字段如:ModifiedDate=getdate(),等。第二,将SQL语句变成存储过程,可以自定义查询关联表,灵活的修改。如:添加的时候定义有效IsValid=1。第三,程序变的简单,每个方法的作用就是执行一个存储过程,相当于存储过程的数据访问方法的映射。如:SQLServerDAL中的5个方法

public void Insert(DemoModel demoModel)

抱歉!评论已关闭.