今天学习了网站开发的一种方法--简单工厂。
它分为七层,创建流程为:
1.网站项目
2.Data(Model)程序集:用来放数据实体类
3.IDAL程序集:用来放针对表的操作接口(增删改查等操作方法)
4.OledbDAL(SqlDAL):实现针对表的操作,其中要写helper类,和实现IDAL中操作的类。
5.DALFactory程序集:工厂,用来实现对不同数据库操作类对象的创建
6.BLL程序集: 业务逻辑层,用来针对功能方法,调用不同表的操作。
它的引用关系:
1.IDAL引用DATA
2.OledbDAL(SqlDAL) 引用 IDAL和Data(Model)
3.DALFactory 引用 IDAL,Data(Model),OledbDAL(SqlDAL)
4.BLL 引用 DALFactory,IDAL,Data(Model)
5.网站项目 引用 BLL
下面以登录窗体为例,代码如下:
可以在web文件中配置字符串例如:
<appSettings>
<add key="conn" value="Data Source=.;Initial Catalog=NewDB;Integrated Security=True"/>
<add key="DAL" value="DALSqlHelper"/>//在Factory中要用
</appSettings>
或者<connectionStrings>
<add name="conn" connectionString="DataSource=.;InitialCatalog=NewDB;Integrated Security=True"/>
</connectionStrings>
第四层的Helper类代码如下:
SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["Key值"]);//或者使用ConfigurationManager类
protected SqlCommand CreateCmd(string sql, List<SqlParameter> listp)
{
SqlCommand cmd = new SqlCommand(sql, conn);
if (listp != null)
{
foreach (SqlParameter op in listp)
{
if (op.Value != null)
{
cmd.Parameters.Add(op);
}
}
}
return cmd;
}
protected int ExeNo(string sql, List<SqlParameter> listp)//增删改操作
{
SqlCommand cmd = CreateCmd(sql, listp);
conn.Open();
int i = cmd.ExecuteNonQuery();
conn.Close();
return i;
}
//查询操作
protected DataTable ExeTable(string sql, List<SqlParameter> listp)
{
SqlCommand cmd = CreateCmd(sql, listp);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
protected DataTable ExeTable(string sql)
{
return ExeTable(sql, null);
}
在Admin类中写sql语句,它继承SqlHelper类,IDAL.IAdmin接口
List<SqlParameter>listp;//装有sql语句和参数的集合
public void GetData(Data.Admin ad)
{
listp = new List<SqlParameter>();
listp.Add(new SqlParameter("@id", ad.Id));
listp.Add(new SqlParameter("@username", ad.UserName));
listp.Add(new SqlParameter("@userpws", ad.UserPws));
}
public DataTable Login()
{
listp = new List<SqlParameter>();
Data.Admin ad = new Data.Admin();
listp.Add(new SqlParameter("@username", ad.UserName));
listp.Add(new SqlParameter("@userpws", ad.UserPws));
string sql = "select * from [User] where username=@username and userpws=@userpws";
return ExeTable(sql, listp);
}
在DALFactory类库中Factory类中写如下代码:
string str=ConfigurationSettings.AppSettings ["DAL"];
private static Factory instance;
public static Factory Instance
{
get { return new Factory (); }
}
public IDAL.IAdmin GetAdmin()
{ //判断使用哪种数据库
//IDAL.INewsClass newsclass = new OledbDAL.NewsClass();
//switch (dal)
//{
// case "Oledb":
// newsclass = new OledbDAL.NewsClass();
// break;
// case "Sql":
// newsclass = new SqlDAL.NewsClass();
// break;
//}
//return newsclass;
object obj = Assembly.Load(str).CreateInstance(str + ".Admin"); //通过程序集路径和类名创建对象实例(反射)
return (IDAL.IAdmin)obj;
}