IssueTrackerCSVS 代码笔记-数据层的反射工厂模式
在IssueTracker项目中,用户可以选择使用Access数据库或者是SQL Server。通过Web.config文件中的
<add key="DataAccessType"
value="ASPNET.StarterKit.IssueTracker.DataAccessLayer.SQLDataAccessLayer" /> 进行配置。
如何实现这个功能,在此项目中使用了反射工厂模式。
反射通俗的说,就是在编译的时候,不知道将要生成的对象是什么。在运行时才根据配置内容,生成相应的对象。
在项目中实现方式如下:
首先定义了抽象类DataAccessLayerBaseClass 在Code/DAL/DataAccessLayer.cs中。在该类中定义对数据操作的所有抽象方法。AccessDataAccessLayer.cs和SQLDataAccessLayer.cs继承DataAccessLayerBaseClass,实现对Access和Sql数据库的数据操作。
在Code/DAL/DataAccessLayer.cs的
1
public class DataAccessLayerBaseClassHelper
2
{
3
public static DataAccessLayerBaseClass GetDataAccessLayer()
4
{
5
Type trp =
6
Type.GetType(Globals.DataAccessType, true);
7
// Throw an error if wrong base type
8
if (trp.BaseType !=
9
Type.GetType("ASPNET.StarterKit.IssueTracker.DataAccessLayer.DataAccessLayerBaseClass"))
10
throw new Exception( "Data Access Layer does not inherit DataAccessLayerBaseClass!");
11
DataAccessLayerBaseClass dc= (DataAccessLayerBaseClass)Activator.CreateInstance (trp);
12
return (dc);
13
}
14
}
15
public class DataAccessLayerBaseClassHelper 2
{3
public static DataAccessLayerBaseClass GetDataAccessLayer() 4
{5
Type trp = 6
Type.GetType(Globals.DataAccessType, true);7
// Throw an error if wrong base type8
if (trp.BaseType != 9
Type.GetType("ASPNET.StarterKit.IssueTracker.DataAccessLayer.DataAccessLayerBaseClass"))10
throw new Exception( "Data Access Layer does not inherit DataAccessLayerBaseClass!");11
DataAccessLayerBaseClass dc= (DataAccessLayerBaseClass)Activator.CreateInstance (trp);12
return (dc);13
}14
}15

Type trp = Type.GetType(Globals.DataAccessType, true); 这就实现了反射工厂的功能。在Globals.DataAccessType配置了是使用AccessDataAccessLayer还是SQLDataAccessLayer
从而使得方法返回正确的数据操作对象。




浙公网安备 33010602011771号