现在的状况是这样的,我的项目需要支持多种数据库,在项目第一次启动的时候检测数据库配置,并设置数据库参数。
现在DAL已经写完了,大概的结构是:
每一个业务逻辑写一个数据操作接口,如:ISysUserDAL.cs然后每种数据库操作写不同的数据操作类,来实现上面的接口,如:
public class SqlServer2000SysUserDAL : ISysUserDAL
public class OracleSysUserDAL : ISysUserDAL
现在的问题是BLL怎么设计呢?
原则:
1、UI层调用方便
2、且针对不同的数据库可能特殊逻辑,比如:针对Oracle和SqlServer的文本字段操作是不同的,SqlServer可能就是比较大众化的,直接存储VARCHAR就可以了,但是Oracle可能就是BLOB字段,所以需要考虑这样的扩展。
都可以说,越细越好,都有分。多谢!

解决方案 »

  1.   

    NHibernate不知你有没有用过,非常优秀的一个ORM组件.
    NHibernate
    根据数据库不同,动态配置NHibernate的数据库方言(Dialect).
    DAL层完全不需要针对不同数据库写不同的代码.
      

  2.   


    首先谢谢,不过我现在的状况是DAL已经完成了,我现在对BLL很迷惑,不知道如何设计
      

  3.   

    可以在这里用一个“策略模式”。1、使用强类型的数据实体。DAL使用强类型向BLL提供数据,不要提供像DataTable等和数据库表名字段名有关的东西。
    2、把ISysUserDAL.cs等接口单独放到一个项目里,成为独立的数据接口层。DAL引用这个数据接口层,实现里面规定的方法;BLL也引用这个数据接口层,调用接口层确定的方法。
    3、BLL里写一段反射代码,根据DAL编译出的dll文件名和数据接口层里的interface反射加载DAL。这样可以通过提供不同的dll文件名加载不同的dll。
      

  4.   

    首先BLL操作对象是DALL,而DALL是实现IDALL接口的。换句话说:BLL层不应该关心是什么数据库,只需要知道DALL需要什么。关于Orcal和SQL的区别,应该在DALL中去处理,而非BLL
      

  5.   

    同意,BLL只是做逻辑判断,数据库的多元化应该是在数据访问层实现。
      

  6.   

    既然你的DAL层已经写好,在BLL层直接调用它的方法就可以了,不需要考虑很多的,
      

  7.   

    楼主是想不同的数据库用不同的业务逻辑来实现,不过既然分层,bll层就不应该关注什么数据库了,VARCHAR也好,BLOB也好,在Bll看来,就是string类型,具体的dal才去关注类型呢,如果业务逻辑牵扯到这些数据类型,那你的idal接口应该没设计好
      

  8.   


    嗯,说得有道理,但是我现在的DAL设计如下:
    首先DBUtility包含DbHelperSQL.cs DbHelperOracle.cs各数据库的基本类;
    然后
    每一个业务逻辑写一个数据操作接口,如:ISysUserDAL.cs然后每种数据库操作写不同的数据操作类,来实现上面的接口,如:
    public class SqlServer2000SysUserDAL : ISysUserDAL
    public class OracleSysUserDAL : ISysUserDAL怎么设计才能支持数据库的多元化的扩展呢?
      

  9.   

    使用原有数据库接口,
     oleconnection
     sqlconnection
     oracleconnection 继承于:idbconnection
      

  10.   

    作为食客(UI)应该去管大厨(BIL)如何煎炒煮炸吗?做为大厨(BIL)应该去管小工(DAL)如何洗菜,切菜吗?
    最基本的责任你还没弄清楚。清洗白菜,萝卜是一个洗法清洗鸡鸭鱼肉又是一洗法问题是这不是大厨关心的事情,无论是mssql这种白菜萝卜,还是啥Oracle这种鸡鸭鱼肉,洗菜的是DAL大厨BIL才不管你怎么洗,你爱怎么洗怎么洗,你可以手工拔毛,也可以用高科技的脱毛机,怎么弄把毛弄干净了,和大厨BIL没关系
      

  11.   

    如果你的DAL把解决支持多数据库的问题带到BLL层,说明DAL有问题,BLL应该不受影响的
      

  12.   


    多谢,看了5楼我已经明白这个问题需要在DAL解决了,但是这DAL一层怎么设计呢(参考10楼)?
      

  13.   

    DbHelperSQL.cs DbHelperOracle.cs 这这些类不是dal层的,只是一个工具类,和分层没有关系。你设计的
    每一个业务逻辑写一个数据操作接口,如:ISysUserDAL.cs然后每种数据库操作写不同的数据操作类,来实现上面的接口,如:
    public class SqlServer2000SysUserDAL : ISysUserDAL
    public class OracleSysUserDAL : ISysUserDAL这样不是已经实现你的功能了么,你的bll层只是用ISysUserDAL接口,压根就不使用SqlServer2000SysUserDAL 和OracleSysUserDAL 这儿还需要一个工厂,不然
    ISysUserDAL su = new  SqlServer2000SysUserDAL(); 这样就麻烦了,要改成ISysUserDAL su = xxx.GetDAL("SqlServer2000"); 
      

  14.   

    DAL层可以使用抽象工厂模式来搞