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

上篇博文到学生表的一个接口由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;
            }
    }
时间: 2024-10-25 07:16:55

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

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

九:UI层 通过反射实现时,得自动添加以下的文件: 如果要换成Access数据库时需要考入的文件: 改配置文件:

谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

<大话设计模式>中第15章中<就不能不换DB吗?>引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序.当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了这对组合的奥秘. 抽象工厂模式(Abstract Factory) 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类.知道它是用来创建工厂的就OK了. 反射 提供了封装程序集.模块和类型的对象.这里仅仅用到反射的一部分功能.且记住它的格式: Assembly.Load("程序集名称

思想上移,行动下移——抽象工厂+反射+配置文件

从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏.虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单.可以说小菜只是帮我们理解了各个设计模式的用途以及有确定,真正的理解还需要我们自己动手实践. 为什么要用抽象工厂? 主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库.引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可

项目总结——谈谈封装(抽象工厂+反射+缓存机制)

今天想给大家说的也是刚刚结束的项目中遇到的一个优秀的封装,当然也要拿出来给大家分享了. 背景交代,我们的项目是一个BS的项目,基本的架构是工厂模式三层,所以就用到了抽象工厂加反射,今天要给大家讲的也就是这块的东西——使用缓存文件. 背景交代完毕. 一.首先说一下什么是缓存文件? msdn上说: 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每

使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......

Put aside the fog and see the essence 解决问题之前,要明白问题为什么会出现 如果只想单纯的解决这个问题的话,直接把错误复制然后百度就会出现很多很多解决方案 如果你想明白为什么会出现这个错误 1.首先了解反射的机制 任何类库编译完成之后都会生成.dll文件,反射就是从当前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll 2.我们来看一下程序的代码和文件 web.config DalFacoty代码 我们找到web层的bin目

机房重构 抽象工厂+反射+配置文件

重构机房已经开始三个多星期了,从刚开始的一头雾水,到现在的柳暗花明,由开始的无从下手,到现在感觉犹 如脱胎换骨了般.和两个星期前相比,现在明朗了多了,心情也好了不少. 先给大家看一下这次重构的整体架构图: 在前面一篇博文中对三层(UI.BLL.DAL.Entity)http://blog.csdn.net/zhangzijiejiayou/article/details/38226135做了详细的介绍. 本篇博客着重总结一下在三层的基础上我所做的改进,也就是传说中的七层. 1.Facade层(外

vb.net版机房收费——助你学会七层架构(二)反射+抽象工厂

上一篇咱们做好了准备工作,数据库设计和Entity层,现在介绍 4.反射+抽象工厂 反射:用来消除Switch和if的,这里我尽量简单地介绍,以便大家理解.反射其实用起来很简单,你就认为他就是决定:去某个地方找应该要实例化的类是哪个.怎么理解? '************************** '文 件 名:DataAccess '命名空间:Factory '内 容: '功 能: '文件关系: '作 者:邱慕夏 '小 组:邱慕夏 '生成日期:2014-06-09 9:17:51 '版 本

设计模式之禅--抽象工厂模式

** 抽 **象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 抽象工厂模式的通用类图 抽象工厂是工厂方法模式的升级版本,在多个业务品种.业务分类时,通过抽象工厂模式生产所需要的对象是一种非常好的方式.所以理论上讲,工厂模式能做的事抽象工厂模式来做也没有问题,高版本兼容低版本嘛~ 开车了~ 女娲造人后传 女娲造人之后发现造出来的人太单调了,因为忘记给人类定义性别了.那现在我们给人类加上性别.其实这里就是一个添加业务品种的过程. 看我们的UML图 见代码 /

SAF 中抽象工厂的实现

本文是<Developing Application Frameworks in .NET>的读书笔记.SAF 是书中的一个范例框架,意为 Simple Application Framework(简单应用程序框架).这篇文章主要向大家说明了SAF中抽象工厂模式的实现方式. 设计思想概述 抽象工厂是很常用的一种创建型模式,它的主要作用在于向程序员屏蔽了创建对象的复杂细节,在获取对象时,只需要在工厂类上调用 GetXXX(),或者 CreateXXX(),便可以得到一个类型实例,而不是通常所使用