zoukankan      html  css  js  c++  java
  • 应用抽象工厂+反射实现通用数据源的设计(二)

        上篇博文到学生表的一个接口由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="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;
                }
        }
    
  • 相关阅读:
    看某视频开始做LINUX笔记的第一天
    shell作业01
    学习shell的第一天
    学python的第三天
    【安全】573- 大前端网络安全精简指南手册
    【JS】572- JS 经典实例收集整理
    【Vuejs】571- Vue 虚拟DOM和Diff算法源码解析
    【JS】570- 揭开 JavaScript 引擎的面纱
    【JS】569- 如何避免这4类 JavaScript 内存泄漏?
    【拓展】如何在Gihub上面精准搜索开源项目?
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/5808888.html
Copyright © 2011-2022 走看看