、逻辑层
这个留言本的逻辑层很简单,由三个类组成,CMessage用来描述一条留言,CReply用来描述一条回复,CReplyCollection集合类用来描述多条回复。
CMessage提供了一个重载的构造函数:
public CMessage(DataRow row)
我们可以用CMessageData中个一个DataRow的数据来初始化一个CMessage对象。
public void FillDataRow(DataRow row)
这个函数则把自身的数据填充进参数中的DataRow对象。我们用类似:
GetMessage().FillDataRow(messageData.AddedNewRow())
这样的代码就可以把一条新的留言内容新增到一个CMessageData对象中,其中GetMessage()是页面上收集用户填入的数据并返回一个CMessage的一个方法。
public CReplyCollection Replys
这个属性用来公开对自身这条留言的所有回复。
四、界面层 - 用户控件
为了方便我们把一个CMessage对象和页面上显示出来的一条留言绑定在一起,把一个CReply对象与页面上显示出来的一条回复绑定在一起,我们制作两个UserControl。MessageBlock控件用来显示一条留言,它通过属性:
public CMessage Message
来对象公开CMessage接口,我们只需要把一个CMessage对象赋值给这个属性,就可以让这个控件显示CMessage对象所表示的留言的内容。
ReplyBlock控件用来显示一条回复,同样通过属性:
public CReply Reply
来公开一个CReply类型的接口。
在MessageBlock控件中,我们根据对应的CMessage对象的Replys属性中所包含的回复,通过LoadControl()方法来动态载入ReplyBlock控件,并放置在一个PlaceHolder类型的Web控件中。
五、界面层 - 页面
现在页面的显示非常简单了,我们在主页面(default.aspx.cs)中创建一个CMessageData对象,填充数据,再用LoadControl()方法来载入MessageBlock控件来显示留言就可以了。
CMessageData messageData = CMessageData.FillDataFromDatabase((iPage - 1) * iPageSize, iPageSize);
for(Int32 i = 0; i < messageData.Count; ++i) {
MessageBlock msg = (MessageBlock)LoadControl("MessageBlock.ascx");
msg.Message = new CMessage(messageData.Tables["MessageTable"].Rows[i]);
hldMessage.Controls.Add(msg);
}
以一个功能齐全的留言本来衡量,我们上面构建的留言本缺少删贴、管理功能,但是只要基础架构出来,完善和扩展功能是非常简单的。
上面的留言本展示了一个基础的程序架构,真正大型程序的架构可能要复杂上很多。比如数据实体类我们可以把字段信息和映射信息放入一个XML文件中,然后我们只需要创建一个通用的数据实体类,通过载入不同的XML文件就可以描述不同的数据实体;在数据复杂的情况下,维护各个数据间的关系也是一个挑战。
源代码可以在http://www.86soft.com/clsoft/kaneboy/gbook.zip下载到,如果你要用,记住修改一下AppParameters.xml文件,至少里面连接字符串的Access文件的路径是需要更改的(你可以干脆在global.asax中用MapPath()来动态得到这个路径:),CAppParameters.cs文件中的_sAppParameterFileName字符串的值也要根据实际情况作出改变(同样你可以用MapPath():),然后在IIS中建立一个名为gbook的虚拟目录来承载这个项目。