开源论坛stella公开+新手指南

类别:Asp 点击:0 评论:0 推荐:
这是我前些日子写的那个论坛,现在终于可以公开了!下面是下载地址:
http://www.mikecat.net/blogview.asp?logID=935
里面的内容是:源文件安装文件(数据库自动安装)、“如何制作自动安装数据库的web安装程序”的教程,stella forum 的文档、model类的uml视图、必读手册。还有一个新年礼物 :)
先祝大家可以顺利的安装完,因为我这个安装程序做的不是太好……
下面我写点指南性的东西,从.net初学者的角度(因为我是初学者,所以我的角度就是初学者的角度,这个逻辑没有问题吧)分析一下我的论坛。

0.model类设计
1.单件和计时器的使用
2.缓存控制
3.性能优化
4.安全性控制
5.疑难

0.model类设计
刚开始设计这个论坛的时候,我正在看《设计模式解析》,这本书上关于oo设计的一些讲解着实让我大开眼界,于是我就试着从oo的角度来考虑问题。我的思想就是把整个论坛看成一个对象,然后论坛包含区域,区域包含版块,版块包含主题,主题包含帖子,而帖子里有会和会员联系起来。最后做的时候因为这个只是传递数据,所以就把行为从对象剥离,得到现在的model类。
但是后来在做的时候发现这些model类要真正的实现包含等关系,其自身还得需要一些行为的,于是就把一些类里面安放了arraylist,这样实现起来就比较方便了。

1.单件和计时器的使用
怎样对论坛里的一些数据进行统计?比如总点击量,某一版块的发贴数?这些数据直接提交到数据库几乎是不可能的。因为变动太快。每次都提交的话数据库会吃不消。于是我就想到了用单件来统计数据,然后定时提交的办法。
modle里面那两个xxxinfosum类是比较特殊的,他们表示的是一些统计数据,为了保证统计的正确性,于是就把他们做成了单件,这样统计数据就不会出现偏差。计时器在应用程序初次启动时开始运行,然后这些数据通过记时器的控制定时向数据库提交。
不过大家在测试的时候可能会有些问题,比如帖子数,这个每发一个帖子论坛数据库就增加一个帖子,然后记数器也加一,但是因为是定时提交的原因,如你在数据还没有提交到数据库就把服务器重起了(或类似的情况,比如动了web.config),那数据就会请零。所以就出现了明明论坛里有帖子但是计数器却显示0的现象。这个大家明白就好了,因为当你真的开始使用论坛的时候,服务器是不可能重起的,计数器也不会被请零。

2.缓存控制
使用缓存是提升性能最直接的办法,这个论坛也大量使用了缓存。大家可以看缓存控制器类里的东西,缓存包括了论坛结构、公告、斑竹、新帖子等。
如何监视数据的改变从而改变缓存是难点之一。在.net 2.0我们发现可以直接监视数据库,但现在的1.1没有办法,框架不提供这种服务。于是我只好手动来完成。通过使用“委托+事件”机制,在business层设置此功能。当表示层把要求传到业务层的时候,如果该请求涉及到缓存的数据的数据库源数据的改变,就对外发布一个事件,然后表示层订阅此事件的响应类得到通知后,就可以把缓存删除。从而达到重新缓存的目的,避免了缓存数据的不一致。
有人可能会问,为什么不直接在表示层操作缓存,比如发出一个请求,然后直接把相应的缓存删除?如果缓存的项目较少,这样做也可以,但是如果比较多,想我写的这个,光键值就十多个,如果一个一个来的话,肯定会晕掉。但是通过上面的办法则可以有效的避免这种情况。处理缓存失效的事件的方法可以只有一个,但是却可以供很多地方使用。

3.性能优化
关于性能优化,大家可以看这篇具指导性的文章
http://blog.csdn.net/notus/archive/2004/12/24/227564.aspx
我就是按照这个来的,呵呵。
a. 最大限度的利用数据库连接,一次连接做尽可能多的事。比如在论坛帖子详细页面,在查找相应页的帖子时,顺便返回了该版块的主题总数,供分页控件使用。还有在更新论坛信息时,打开一次连接后,连续执行数条sql语句来进行更新。
b. 使用缓存。这里包括数据缓存和输出缓存。数据缓存上面提到了。输出缓存通过相应的用户控件来完成。凡是不需要动态改变的,都做成了局部缓存。
c. 控制viewstate。这个大家可以看看显示到浏览器后页面的源文件,应该看不到长长的viewstate隐藏字段。因为我把不需要的viewstate都禁掉了。首先大家应该明白,像repeater和datagrid这样的东西,viewstate是绝对不能要的!你可以想办法来弥补由此造成的一些功能损失。虽然这样麻烦了些,但是绝对值。而那些小东西,比如一个按钮,viewstate该禁止也要禁止。

4.安全性控制
加密和角色控制是我要说的。
先是加密,这里主要是对数据库连接字符串和用户密码进行加密。前者使用了petshop的相关组件对保存在web.config中的连接字符串进行了加密。不过像懒人说的“防君子不防小人”。用户密码加密使用了sha1+salt的办法,这一套是从duwamish学来的。这个办法有个不好的地方,整个地球只有用户自己知道密码是什么,一旦用户忘了密码,事情就比较麻烦了。需要先生成随机密码更新数据库,然后把随机密码告诉用户(email),用户再把密码改成自己熟悉的。有文章说可以使用对称加密的办法,不过问题是钥匙该怎么保存?
角色控制就是使用了forms验证。三个角色各负其职,除了在web.config中设定外,还在代码中使用了特性对相应的方法进行控制,这样就算有人改了web.config,也没有办法执行超越权限的操作。
特别要说的是斑竹的控制,版块A的斑竹不能去版块B里删帖子,这一点很重要。为此我些了一个专门的判断方法,用来判断登陆的斑竹是否是该版块的斑竹。

5.疑难
自卖自夸了这么久,接下来我要说说让我头痛的地方。除去用户输入验证这些小东西,最让我难受的就是static变量的使用。我发现自己对clr竟然完全的不了解!还有就是多态的使用。这个也让我痛苦了好久。接下来是对gc机制的怀疑,ms给我们这么个东西,到底该不该信任?
总之,要学的实在是太多太多……


就写这么多了,还有问题大家就留言吧,如果我还能上网的话,就一定解答……

let us walk together,so as not lose our way!!

a happy new year!!

2005年再见!!

本文地址:http://com.8s8s.com/it/it7520.htm