目前我对设计模式方面了解的不多,会的设计模式五根手指头就能数完。怎么写好设计模式让读者看懂真的要讲究一下技巧,不能单纯的贴代码并对代码作解释,我觉的《大话设计模式》就是一本讲设计模式很好的书,那本书通过故事的形式讲解让人联想思考下去。
由于水平有限,所有这篇文章没什么讲解的,只是写一下自己使用抽象工厂实现多数据库切换的实现过程。
例子的目的
有时候项目里使用的是ACCESS数据库,可是突然有一天想更改成MSSQLSERVER数据库,为了防止整站代码重写这种局面,可以使用抽象工厂+反射实现修改一下配置字符串就能实现ACCESS的MSSQLSERVER数据库的切换。
实现过程
1、数据库的建立
为了例子的讲解的方便,我们就只在数据库里建立一张表,一张顾客表(Customer)。在MSSQLSERVER数据库里创建表的SQL语句如下:
1 use test; 2 create table Customer 3 ( 4 id int identity(1,1) primary key, 5 cName nvarchar(50), 6 cPhone nvarchar(50) 7 )
在ACCESS数据库里也一样创建一张Customer表,字段名一样。
2、建立项目和类库的准备工作
先在VS里面建立一个空的WEB应用程序,我起名为抽象工厂DEMO,之后建立数据库的接口类库IDAL。再建立ACCESS的数据库访问类库为AccessDAL,SQLServer的数据库访问类库SQLServerDAL。AccessDAL和SQLServerDAL是对IDAL接口类库的实现,最后再建一个模型层Model。这样准备工作就好了。大概需要的类库和项目如下图所示:
3、对IDAL类库的代码实现
在IDAL就要建立一个类,可以在类里实现对表的增删查改等操作。这里为了做例子的方便就只实现增和查两个接口。
建立一个类ICustomer,如下图所示
//ICustomer.cs接口的代码 public interface ICustomer { bool Insert(Customer customer); Customer Get(int id); }
4、对Model层代码的实现
接口两个类,Customer.cs 如图:
5、对SQLServerDAL类库里的代码的实现
在SQLServerDAL里建立一个类SQLServerCustomer.cs。实现对ICustomer的接口。如图:
SQLServerCustomer.cs的代码 如下:
6、对AccessDAL类库里的代码实现
这里在做的时候碰到一点问题,ACCESS数据库我放在WEB项目的DataBase文件夹里,可是在类库里如何WEB项目里的DataBase文件夹的数据库文件进行访问呢?
必须要用到HttpContext.Current.Server.MapPath,在使用这句必需先引用using System.Web;
AccessCustomer.cs的代码如下:
7、使用反射的DataAccess类实现数据库更改设计
这里是关键,通过反射
可以实现只要更改
private static readonly string AssemblyName = "AccessDAL";
private static readonly string db = "Access";
就能实现对数据库更改的作用。 文章地址http://www.yhbet365.com/list.asp?cid=2
上面是使用ACCESS数据库,如何我突然想更换成MSSQLSERVER数据库,那么我只要把这两句更改成
private static readonly string AssemblyName = "SQLServerDAL";
private static readonly string db = "SQLServer";
就可以了。
先在WEB项目里建一个类名为DataAccess。如图所示:
DataAccess的代码如下:
namespace
抽象工厂DEMO
{
public
class
DataAccess
{
//只需要更改这两处就行了
//private static readonly string AssemblyName = "SQLServerDAL";
//private static readonly string db = "SQLServer";
private
static
readonly
string
AssemblyName =
"AccessDAL"
;
private
static
readonly
string
db =
"Access"
;
public
static
ICustomer CreateCustomer()
{
string
className = AssemblyName +
"."
+ db +
"Customer"
;
return
(ICustomer)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
}
|
完成这七部就可以了,建一个DEMO.ASPX页面做一下测试,代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
protected
void
Button1_Click(
object
sender, EventArgs e)
{
Customer customer =
new
Customer();
customer.CName =
"demo1"
;
customer.CPhone =
"9999"
;
ICustomer ic = DataAccess.CreateCustomer();
ic.Insert(customer);
Response.Write(
"success"
);
}
protected
void
Button2_Click(
object
sender, EventArgs e)
{
Customer customer =
new
Customer();
ICustomer ic = DataAccess.CreateCustomer();
customer = ic.Get(1);
Response.Write(customer.CName);
}
|