抽象工厂 加 反射
前两天做项目,使用的是 三层架构加 抽象工厂 加 反射 来完成的。
//code
原先的Dal层 现在变成了 一个接口IDal 和 一个DBUnility
IDal:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace IDal
{
public interface Car
{
int addCar(Model.Car carM);
int deleteCar(int id);
public int updateCar();
DataTable queryCar(Model.Car carM);
DataTable showCar();
}
}
DBUnility 负责多个数据库的连接操作:
eg:下面是sqlserver数据库的例子,名字叫sqlhelper
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DBUnility
{
public class sqlhelper
{
private static readonly string conStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
public static DataTable show(string sqlStr)
{
using (SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlStr;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
}
public static int executeNonquery(string sqlStr)// 这个是executenonquery 还有什么返回database的,executescalard的就是一类型的归为一类 减少代码
{
using(SqlConnection conn = new SqlConnection(conStr))
{
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = sqlStr;
return cmd.ExecuteNonQuery();
}
}
}
}
这行紫色部分:
在config文件中写入
<connectionStrings>
<add name="connStr" connectionString="Data Source=CRUELBB;Initial Catalog=practice;Integrated Security=True"/>
</connectionStrings>
用来连接数据库的。
再来一个DalFactory(所谓的抽象工厂)
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace DalFactory
{
public class createinstance
{
private static readonly string dalStr = ConfigurationManager.AppSettings["dalStr"].ToString();
public static IDal.Car getTab_car()
{
return (IDal.Car)Assembly.Load(dalStr).CreateInstance( dalStr+".Car");
反射
提供了封装程序集、模块和类型的对象。这里仅仅用到反射的一部分功能。且记住它的格式:
Assembly.Load(“程序集名称”) . CreateInstance(“命名空间 . 类名称”)
}
}
}
这行绿色部分:在config文件中写入
<appSettings>
<add key="dalStr" value="SqlDal"/>
</appSettings>
可以看出是用来 便于切换数据库的 ,切哪个数据库 DBUnility就连哪一个 ok。
然后Bll层:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
namespace Bll
{
public class Car
{
private IDal.Car dal;
public IDal.Car Dal
{
get
{
if (dal == null)
dal = DalFactory.createinstance.getTab_car();
return dal;
}
//set { dal = value; }
}
public DataTable show()
{
//SqlDal.Car carD = new SqlDal.Car();
//return carD.showCar(carM);
return Dal.showCar();
}
public int delete(int id)
{
return Dal.deleteCar(id);
}
public int add(Model.Car carM)
{
return Dal.addCar(carM);
}
}
}