首页 > 代码库 > 应用抽象工厂+反射实现通用数据源的设计(二)

应用抽象工厂+反射实现通用数据源的设计(二)

    上篇博文到学生表的一个接口由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();        }    }

 七:简单工厂对抽象工厂进行改进:DataAccess 目的:不让前台进行判断,通过抽象工厂结合配置文件决定产生哪个具体的工厂,具体工厂产生具体的产品(引入连两个接口:MySchoolIStudens和MySchoolIFactory

   首先在App.Config中添加:

<add key="db" value="http://www.mamicode.com/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;        }    }

 八:业务逻辑层:MySchoolBLL  添加的引用:(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;            }    }

 

应用抽象工厂+反射实现通用数据源的设计(二)