jiahaipeng

我要飞得更高
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

linq下数据库接口的定义和实现(linq to SQL)

Posted on 2008-11-26 09:52  飞得更高  阅读(2269)  评论(5编辑  收藏  举报

    B/S系统典型的三层架构:业务逻辑层,数据访问层和UI显示层。为了实现业务逻辑层和数据访问层的松耦合,就要在业务逻辑层中定义数据库接口,并在数据访问层实现这些接口。

    linq的出现填平了对象世界和数据世界的鸿沟,把数据当对象,使我们操作数据就像操作对象一样简单。我们定义自己的业务实体类,在类中定义对这些实体数据的操作,将这些操作提交数据库。一切看上去是那么简单,但是,如何将这些实体类和数据库中的数据联系起来呢?我们在什么地方定义这些联系呢?很快,我想到了数据访问层,在数据访问层中定义和实现这些联系,为了实现数据访问层和业务层的松耦合,我又在业务层上定义了数据库接口。

    我在业务层定义了两个接口:数据库接口(IDatabase)和实体数据访问接口(IEntityDataAccess)。

    实体数据访问接口(IEntityDataAccess),继承IQueryable,定义了对实体的操作:

  1. 添加实体
  2. 删除实体
  3. 取得实体对应的数据库

    数据库接口(IDatabase)定义了对数据库的操作:

  1. 取得实体的数据访问
  2. 提交数据库变更
  3. 执行sql语句
  4. 取得业务实体

    下面是示例代码:

    实体数据访问接口(IEntityDataAccess): 

Code

     数据库接口(IDatabase)(假设已经有有个实体:User和UserRole):

Code

    定义完成这些接口以后,我们就要在定义数据访问层,并在数据访问层中实现定义在业务层的接口。

    数据访问层中有两个类:Database和EntityDataAccessAdapter,还有linq的映射文件MappingSource。

    首先,是Database类,继承于IDatabase接口,这个类实现的功能如下:

  1.  根据连接字符串和映射文件取得数据库。
  2. 实现数据库接口
  3. 取得业务实体

    代码如下:

Code

   其次,是EntityDataAccessAdapter,继承于IEntityDataAccess。实现的功能如下: 

  1. 实现各个接口的功能。
  2. 将linq定义的数据访问方法适配到业务层定义的数据访问接口上。

代码如下:

Code

     通过以上操作,定义了数据访问层,并在其中实现了在业务层中定义的接口。实现了数据访问层和业务层的松耦合。

后记:

    这是我在博客园上发表在首页的第一篇文章,水平有限,很属于菜鸟的初级阶段,难免会有错误和不足,欢迎各位高手批评指正^_^。也希望能抛砖引玉,欢迎交流。^_^