Stella 知识库--模型类的设计

时间:2021-02-15 23:30:43

-- 系列文章与Stella Forum v2.0搭配使用效果更好 --

这里的模型类,在有些地方也叫“业务实体”等名字,一句话,是一些代表了软件世界需求的剥离了行为的类。
没有了行为,这些类自然就是一些数据的集合,而他们的作用,自然也是传递数据。在分层的架构中,使用模型类来传递数据更加的有意义。
说了这么多,下面来看为什么要使用这个
1.方便在层间传递数据
2.面向对象设计的需要


先来看一个例子。
private void doLogin()
{
//构造一个游客
Model.Guest g=new Stella2.Model.Guest();
g.Name=this.uname.Text;
g.Pwd=this.pwd.Text;
//系统检查出示的凭证
Business.Forum f=new Stella2.Business.Forum();
//返回一个登录用户
Model.User user=f.Login(g);

if(user==null)
{
//错误处理
}
else
{
//这里是把当前用户保存到session中
StellaContext.Current.User=user;
//其他设置
}
}
第一眼看这个程序,基本上就和现实世界中的情况差不多,一个游客过来,出示他的身份凭证(用户名和密码),然后系统检查,如果合法,那就让游客进入,这时 该游客就成了一个登录用户,如果他提供的凭证不合法,那就禁止入内。所有这一切都很自然,这也是面向对象设计的魅力吧。
Guest和User是用到的两个模型,篇幅限制,我们只看前者的定义吧。
/// <summary>
/// 游客
/// </summary>
public class Guest
{
private String m_Name; //用户姓名
private String m_Pwd; //用户密码

///<summary>
///用户姓名
///</summary>
public String Name
{
get { return m_Name;}
set { m_Name = value;}
}
///<summary>
///用户输入的明文密码
///</summary>
public String Pwd
{
get { return m_Pwd;}
set { m_Pwd = value;}
}
}

这个模型很简单,就包括两个属性,用户名和密码。
想象一下,如果不这样,那我们就需要这样来做验证
Business.Forum f=new Stella2.Business.Forum();
//返回是否合法
bool isLogin=f.Login(this.uname.Text,this.pwd.Text);
if(isLoginl)
{
//繁琐的session,cookie设置
}
else
{
//错误处理
}

想象一下那里的设置都需要做什么,把用户资料一个一个的保存到session,然后设置权限...

更恐怖的是:
Business.Forum f=new Stella2.Business.Forum();
string msg=f.CreateUser(newUser);
这个是用户注册时的代码,如果不使用模型类,那就需要这样
Business.Forum f=new Stella2.Business.Forum();
string msg=f.CreateUser(name,pwd,email,answer,question,qq,homepage,signature,honour,skins);
好长啊……
别忘了,分层结构意味着,这种方法签名至少要出现三次!!!
所以……

模型类的讨论到这基本结束,最后要说的一句,模型类也并不是万能的。如您的数据结构很复杂,比如说有一百多张表……要全部建模型类估计就不是那么容易,这 个时候,或许有更好的选择,那就是:DataSet。从本文的观点看,DataSet的缺点,或许只是不符合面向对象的设计而已。