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