应用抽象工厂+反射实现通用数据源的设计(二)
原创
©著作权归作者所有:来自51CTO博客作者zhangyongshizhi的原创作品,请联系作者获取转载授权,否则将追究法律责任
上篇博文到学生表的一个接口由SqlServerDal和AccessDal层实现具体的方法。
下面定义一个生产抽象产品工厂的接口:
五:定义MySchoolIFactory下IStudentFactory的工厂(引用IStudens接口):
public interface IStudentFactory
{
//产生学生接口的抽象工厂接口
IStudent CreateStudent();
}
六:有两个具体的工厂:SQLServerFactory和AccessFactory(引用MySchoolIStudens和MySchoolIFactory):
1.SQLServerFactory另外添加SQLServerFactory的引用。
public class StudentFactory:IStudentFactory
{
public IStudent CreateStudent()
{
// 创建具体产品的工厂 (生产的是sqlserver产品的工厂)
// StudentServer studentService = new StudentServer();
// return studentService;
return new MyScholSQLServerDal.StudentServer();
}
}
2.AccessFactory添加AccessDal的引用
public class StudentFactory:IStudentFactory
{
public IStudent CreateStudent()
{
//创建具体的Access产品
return new MySchoolAccessDal.StudentServer();
}
}
MySchoolIStudens和MySchoolIFactory)
首先在App.Config中添加:
<add key="db" value="SQLServer" />
/// <summary>
/// 产生一个具体的工厂 返回一个接口(抽象工厂)
/// </summary>
public class DataAccessFactory
{
//读取数据库的配置
private static readonly string db = ConfigurationManager.AppSettings["db"];
//定义程序集
private static readonly string assName = db + "Factory";
//定义命名空间
private static readonly string nameSpace = db + "Factory";
/// <summary>
///通过反射动态决定加载那个程序集
/// </summary>
/// <returns></returns>
public static IStudentFactory CreateStudentFactory()
{
//反射具体的类 加载程序集
Assembly ass = Assembly.Load(assName);
//创建一个类的实例
IStudentFactory factory = ass.CreateInstance(nameSpace + "." + "StudentFactory") as IStudentFactory;
return factory;
}
}
MySchoolModels和MySchoolIFactory和DataAccess和MySchoolIStudens;)
public class StudentManager
{
//通过配置文件产生抽象工厂
private IStudentFactory studentFactory=DataAccessFactory.CreateStudentFactory();
//具体的产品
private IStudent studentMgr=null;
//构造函数
public StudentManager()
{
studentMgr=studentFactory.CreateStudent();
}
/// <summary>
/// 得到所有的学生信息
/// </summary>
/// <returns></returns>
public IList<Student> GetAllStudents()
{
return studentMgr.GetAllStudents();
}
/// <summary>
/// 根据主建ID查询学生
/// </summary>
/// <param name="stuno"></param>
/// <returns></returns>
public Student GetStudent(int stuno)
{
return studentMgr.GetStudent(stuno);
}
/// <summary>
/// 根据学生的姓名进行查询
/// </summary>
/// <param name="stuname"></param>
/// <returns></returns>
public IList<Student> GetStudentByName(string stuname)
{
return studentMgr.GetStudentByName(stuname);
}
/// <summary>
/// 添加一个学生
/// </summary>
/// <param name="student"></param>
/// <returns></returns>
public bool AddStudnet(Student student)
{
return studentMgr.AddStudnet(student)>0;
}
/// <summary>
/// 删除一个学生
/// </summary>
/// <param name="stuno"></param>
/// <returns></returns>
public bool DelStudetnt(int stuno)
{
return studentMgr.DelStudetnt(stuno) > 0;
}
}