C#——依赖接口编程与简单工厂

在开发一个项目的时候,有时候会碰到这样一个问题:就是项目开发到一半时,原先对数据库的访问走的是ADO.NET,中途项目经理突然要求改成使用EF实体模型去访问数据库......呃好吧!这样的话就需要去把原有的代码个修改,我们都知道在ADO.Net中,数据访问层DAL与业务逻辑层是耦合在一块的,当数据访问层的代码由原来的使用ADO.NET去访问数据库变为使用EF实体模型去访问数据库时,业务逻辑层BLL的代码也要去相应的改变(这是一件相当痛苦的事情)

 1        //private UserEFDAL userefDal = new UserEFDAL();//当项目使用EF去访问数据库时创建一个实例
 2
 3         // private UserInfoDAL userDal = new UserInfoDAL();//当项目使用ADO去访问数据库时创建一个实例
 4        //但是以上的方法当数据库访问的方法改变时,BLL层都要做出相应的改变并且不能保证改变后nwe出的实例名称相同
 5        //那样就相当的悲剧了、、、、
 6 public User Add(User userInfo)
 7        {
 8            return userDal.EFAdd(userInfo);//当通过两种方法new出来的实例名称不同时,悲催了。。。。
 9
10            //return userefDal.ADOAdd(userInfo);
11        }         

通过上面的简单的代码我们可以发现,当我们要切换数据库的访问方式时,需要不断的去改变new实例的名称,并且在EF中定义的添加的方法叫EFAdd,在ADO中定义的添加的方法叫ADOAdd,这样去修改代码的的工程非常的浩大(当你去改完时,估计你也被炒鱿鱼了),而我们又希望能够在当数据访问的方式不用的时候,BLL层的代码改变很少,或者不去改变BLL层的代码就能切换数据库访问的方式,我们希望在不同是数据访问方式不同时,内部的方法不变,我们规定在ADO或是EF中添加的方法为Add、修改的方法为Edit等。说到这,想必大家应该明白接下去要说的是什么了,没错,就是接口,在C#中什么是接口?所谓的接口其实就是一种规范,使得实现接口的类或结构在形式上保持一致,当一个类去继承该接口时,就必须实现该接口的所有成员,使用接口可以使程序更加清晰和条理化,这就是接口的好处。

所以,在上面的例子中,我们可以定义一个接口,让EFDAL和ADODAL去继承这个接口

//定义一个接口,当使用ADO.NET访问数据库或是时候EF实体模型访问时,都继承于这个接口
   public  interface IDALInterface
    {
     //这里还可以定义多个成员
       User Add(User userInfo);
    }

//EFDAL去继承IDALInterface这个接口
public class UserEFDAL : IDALInterface
  {
        DataModelContainer db = new DataModelContainer();
        public User Add(User userInfo)
        {

            db.User.AddObject(userInfo);
            db.SaveChanges();
            return userInfo;
        }
    }

public class UserInfoDAL : IDALInterface//ADO.NET访问数据库时继承IDALInterface接口
    {
        /// <summary>
        /// 实现IDALInterface接口
        /// </summary>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public User Add(User userInfo)
        {
           //这里执行Add操作并返回插入的实体
            return userInfo;
        }
    }
      //BLL层代码
       IDALInterface userDal = new UserEFDAL();
       //在这里因为EF的DAL与ADo的DAL都继承自IDALInterface
       //当访问数据库的方式改变后,只要改变相应的数据库访问实例。这样就减少的代码的改动量
public User Add(User userInfo)
       {
           return userDal.Add(userInfo);

           //return userefDal.Add(userInfo);
       }

通过上面的例子,我们可以看到,只要在BLL层改变new不同的的实例,而不需要去改变太多的BLL的代码,就可以在不同的数据访问的方式切换,当然还是需要在BLL层修改代码。我们还是需要去一个个的找 IDALInterface userDal = new UserEFDAL();,然后去修改,有没有一种方法可以做到不去修改BLL层的代码而就能改变不同的数据库访问方式,答案当然是有的。我们可以创建一个工厂,通过反射的方法去创建一个实例

/// <summary>
       /// 创建一个简单的工厂来获取相应的程序集,
       /// </summary>
       /// <returns></returns>
       public static IDALInterface GetDALStyle()
       {
           string assemblyName = ConfigurationManager.AppSettings["assemblyName"];//通过配置文件来配置数据库的访问的方式
           string typeName = ConfigurationManager.AppSettings["typeName"];

           //通过反射创建一个实例
           return Assembly.Load(assemblyName).CreateInstance(typeName) as IDALInterface;
       }

而相应的BLL的代码就改成

       IDALInterface userDal = DALSimpleFactory.GetDALStyle();//通过工厂去创建一个实例
       public User Add(User userInfo)
       {
           return userDal.Add(userInfo);

           //return userefDal.Add(userInfo);
       }

至此,我们就只需在配置文件中去修改相应的配置,就可以在不修改过多的代码下完成不同数据库访问方式的切换,大大减少的项目的开发的周期,通过工厂来得的实例,可以大大的减少BLL层与DAL层之间的耦合,也就是所谓的解耦。

时间: 2024-11-05 07:19:58

C#——依赖接口编程与简单工厂的相关文章

依赖接口编程

//分层的思想:模块内部之间高内聚,模块外部之间低耦合 //当遇到跨数据库时候,数据库访问驱动层就会产生变化,就会直接影响采用高耦合使用该层的的代码块 //解决模块间高耦合的状况思路:利用接口或者抽象类来进行隔离,不再依赖具体的类的实现(new xxx) 依赖接口编程: //UserInfoDal userInfoDal = new UserInfoDal(); //这种直接new出DAL层的内容是一种高耦合,只要DAL层的类发生变化这里也会受到很多影响 //所以不应该依赖[UserInfoDa

面向对象编程思想-简单工厂模式

一.引言 简单工厂.工厂方法.抽象工厂模式都属于设计模式中的创建型设计模式,它们帮助我们把对象的实例化部分抽取出来,进而优化系统架构,提高系统的扩展性.本文介绍一个比较容易理解的模式-简单工厂模式. 二.简单工厂模式 定义:"工厂"?!看到这个词语,在现实生活中大家会想到是生产产品的,同样,在简单工厂模式里大家可以理解为工厂其实就是创建对象的一个类.平时我们编程的时候,当使用"new"创建对象时,此类就增加了对该对象的依赖,它们之间的耦合度就增加了,这样当业务需求变

0.简单工厂-simplefactory(非23之一)

初识简单工厂 定义 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于创建型模式.提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类.(ps:简单工厂不是一个标准的设计模式) 结构和说明 Api:定义客户所需要的功能接口 Impl:具体实现Api的实现类,可能会有多个 Factory:工厂,选择合适的实现类来创建Api接口对象 Client:客户端,通过Fa

简单工厂模式——接口使用

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 接口规则: 1.里面的方法全部都是public修饰的(就算不写也是public的) 2.里面的申请的属性,全部都是public的静态常量 3.接口里面没有构造器 4.接口里面没有静态块 5.接口里面没有实例块 6.在java1.7版本后可以写public静态方法 7.接口和接口之间可以多继承 8.一个类可以实现很多个接口 凯哥赠语:只要申请了接口,就应用接口

5 简单工厂、工厂、抽象工厂

一 简单工厂 讲代码中负责根据不同情况创建不同类的if else 或者switch case语句抽提出来就构成了简单工厂,即简单工厂专门负责类的生产. 比如,head first中举的pizza例子,用SamplePizzaFactory负责根据客户的选择创建ChessPizza.GreekPizza等不同种类的Pizza. class SampleFactory { public Pizza CreatePizza(string type) { Pizza pizza; if (type ==

Java 设计模式之 简单工厂模式(静态工厂方法模式)

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(或者父接口). 简单工厂模式的  UML 图: (1)抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口. (2)具体产品(Concrete Product)角色:简

Java设计模式(一) 设计模式初探——简单工厂和工厂方法模式

一.引言 在面向对象的编程中,创建对象是最基本也是最常用的一种操作,合理的对象创建方法对提高代码的复用性和降低模块之间的耦合来说极其重要,而工厂模式就是专门为合理创建对象而提出的.在GoF总结的23种常用的设计模式中,工厂模式就有3种,分别为简单工厂.工厂方法和抽象工厂,本文将结结合简单的例子对面向对象的编程.简单工厂模式和工厂方法模式进行较为详细介绍,并给出完整的代码示例,至于抽象工厂方法,我将在后续的博客中进行详细地介绍. 借助于面向对象编程的封装特性,我们将一个完整事物的不同功能模块封装成

浅谈简单工厂,工厂方法,抽象工厂的区别和使用

工厂模式是分为三种,分别是简单工厂,工厂方法,抽象工厂.其中工厂方法和抽象工厂是GoF23种设计模式中的一种,而简单工厂则不是一种设计模式,更加可以理解的是一种编码时候预定俗称的一种习惯.那么,就在接下来三点中分别去分析理解工厂模式. 一 简单工厂:通过实例化一个工厂类,来获取对应的产品实例.我们不需要关注产品本身如何被创建的细节,只需要通过相应的工厂就可以获得相应的实例.简单工厂包括三种角色: 1.工厂:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直

易学设计模式看书笔记(2) - 简单工厂模式

本文摘自易学设计模式一书 一.简单工厂模式 1.动物管理系统的例子 public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public class D