.net已经到了2005,微软的PetShop3.0也已经到了4.0,现在还学习PetShop3.0,纯属弥补以前学习.net漏掉的步骤。毕竟有些东西,不看的话,还是不知道的。网上关于PetShop的文章多是从架构或者语言特性方面来说的,所以决定先从最基本的页面分析开。
登陆页面SignIn.aspx。一个img用来注册,转到新的注册页面。有一个imagebutton,用来提交页面。两个img,都设置了alertText似乎是个好的习惯。提交按钮调用后台SubmitClicked方法。
1) (signIn.aspx.cs)PetShop3.0是业务实体和业务逻辑分开的,并且在表示层上也有逻辑处理。例如WebComponents.CleanString就是用来进行输入的合法性检验。
string userId = WebComponents.CleanString.InputText(txtUserId.Text, 50);
string password = WebComponents.CleanString.InputText(txtPassword.Text, 50);
首先,判断输入字符串长度,超过最长长度则截取。然后替换掉一些危险的字符’ ” , <, >,’ ’。
for (int i = 0; i < inputString.Length; i++) {
switch (inputString[i]) {
case '"':
retVal.Append(""");
break;
case '<':
retVal.Append("<");
break;
case '>':
retVal.Append(">");
break;
default:
retVal.Append(inputString[i]);
break;
}
}
// Replace single quotes with white space
retVal.Replace("'", " ");
2) (PetShop.Web.ProcessFolw.AccountController.cs)接下来进行正式的帐户登陆。accountController.ProcessLogin(userId, password),判断返回值来表示是否登陆成功。新建业务层的account类,调用account.SignIn(userId, password)来登陆帐户。
通过判断myAccountInfo来判断是否成功登陆。
Account account = new Account();
AccountInfo myAccountInfo = account.SignIn(userId, password);
3) 似乎是PetShop3.0 的亮点之一,充分使用了语言本身的特性,动态创建Dao层,避免了原来那些创建模式的弊端。(PetShop.BLL.Account.cs)account.SignIn的方法如下。
public AccountInfo SignIn(string userId, string password) {
if ((userId.Trim() == string.Empty) || (password.Trim() == string.Empty))
return null;
IAccount dal = PetShop.DALFactory.Account.Create();
AccountInfo account = dal.SignIn(userId, password);
return account;
}
这里PetShop.DALFactory.Account.Create()利用了依赖注入。利用WebConfig读去要新建的类的名字。<add key="WebDAL" value="PetShop.SQLServerDAL" />。表示该类支持SQL.新建一个DAL层的Account的实例。
public static PetShop.IDAL.IAccount Create()
{
string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];
string className = path + ".Account";
return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);
}
4) (PetShop.DALFactory.Account.cs) AccountInfo account = dal.SignIn(userId, password)开始数据层的访问。传入用户名和密码。如果有返回值说明用户存在。返回一个AccountInfo实体类。
5) (回到PetShop.Web.ProcessFolw.AccountController.cs)成功登陆开始页面导向。返回到原来登陆的页面。并把帐户信息存入session。
if (myAccountInfo != null) {
HttpContext.Current.Session[ACCOUNT_KEY] = myAccountInfo;
if (FormsAuthentication.GetRedirectUrl(userId, false).EndsWith(URL_DEFAULT)) {
FormsAuthentication.SetAuthCookie(userId, false);
HttpContext.Current.Response.Redirect(URL_ACCOUNTSIGNIN, true);
}else{
FormsAuthentication.SetAuthCookie(userId, false);
HttpContext.Current.Response.Redirect(FormsAuthentication.GetRedirectUrl(userId, false), true);
}