B/S系统典型的三层架构:业务逻辑层,数据访问层和UI显示层。为了实现业务逻辑层和数据访问层的松耦合,就要在业务逻辑层中定义数据库接口,并在数据访问层实现这些接口。
linq的出现填平了对象世界和数据世界的鸿沟,把数据当对象,使我们操作数据就像操作对象一样简单。我们定义自己的业务实体类,在类中定义对这些实体数据的操作,将这些操作提交数据库。一切看上去是那么简单,但是,如何将这些实体类和数据库中的数据联系起来呢?我们在什么地方定义这些联系呢?很快,我想到了数据访问层,在数据访问层中定义和实现这些联系,为了实现数据访问层和业务层的松耦合,我又在业务层上定义了数据库接口。
我在业务层定义了两个接口:数据库接口(IDatabase)和实体数据访问接口(IEntityDataAccess)。
实体数据访问接口(IEntityDataAccess),继承IQueryable,定义了对实体的操作:
- 添加实体
- 删除实体
- 取得实体对应的数据库
数据库接口(IDatabase)定义了对数据库的操作:
- 取得实体的数据访问
- 提交数据库变更
- 执行sql语句
- 取得业务实体
下面是示例代码:
实体数据访问接口(IEntityDataAccess):
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
数据库接口(IDatabase)(假设已经有有个实体:User和UserRole):
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
定义完成这些接口以后,我们就要在定义数据访问层,并在数据访问层中实现定义在业务层的接口。
数据访问层中有两个类:Database和EntityDataAccessAdapter,还有linq的映射文件MappingSource。
首先,是Database类,继承于IDatabase接口,这个类实现的功能如下:
- 根据连接字符串和映射文件取得数据库。
- 实现数据库接口
- 取得业务实体
代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
其次,是EntityDataAccessAdapter,继承于IEntityDataAccess。实现的功能如下:
- 实现各个接口的功能。
- 将linq定义的数据访问方法适配到业务层定义的数据访问接口上。
代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
通过以上操作,定义了数据访问层,并在其中实现了在业务层中定义的接口。实现了数据访问层和业务层的松耦合。
后记:
这是我在博客园上发表在首页的第一篇文章,水平有限,很属于菜鸟的初级阶段,难免会有错误和不足,欢迎各位高手批评指正^_^。也希望能抛砖引玉,欢迎交流。^_^