惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - dragonpro

初创公司招聘 程序员 平面设计师 软件销售(成都) 分享一组红白机音乐Remix 初识北京 2008,再会,深圳 顾客想要的和说的不一样 从String到enum的互换(string to enum to string) CommunityServer系列之十一:优秀的URL重写机制 Community Server系列之十:让CS2支持中文搜索 Community Server系列之九:CS2中的用户管理1(MemberRole) Community Server系列之八:CS2中的CSContext Community Server系列之七:快速找到需要修改的文件[技巧] Community Server系列之六:CS2中的关键词及数据结构 Community Server系列之五:CS2中的Ajax原理 Community Server系列之四:Ajax在CS2.0中的应用1 Community Server系列之三:页面间关系2[介绍] Community Server系列之二:页面之间的关系1[介绍] Community Server系列之一:开篇简介 梦里的灵感 异构数据库转换工具的结构说明
使用Enterprise Library DAAB架构灵活的数据提供层
dragonpro · 2006-04-11 · via 博客园 - dragonpro

前段时间提到使用DAAB模块引用到自己的系统中遇到的困惑:http://dragonpro.cnblogs.com/archive/2005/10/20/258486.html
后来经过我的反复思索和试验,找到了一种折中的方式,既尽量减少了重复代码屏蔽了数据库的异构问题,又可以较合理体现分层体系。现在抽空把这个架构分享出来,给大家多多少少一点参考,也希望多批评指正。

目的:

  • 轻松切换数据库平台,在不修改业务逻辑的前提下切换数据库
  • 尽量减少重复代码量,能抽象出来的抽象出来
  • 降低维护成本

按照这三方面来考虑,参考了这么几种方式:

1.         单独建立DAL接口,在数据提供层分别实现这些接口,在应用层调用这些接口方法,另外还要工厂方法来实时装配这些实现,这适合在一些较小型的应用,比如.NET Petshop。优点是规范,性能好,缺点是维护较麻烦。

2.         在应用层提供抽象类的抽象方法,然后分别在数据层实现这些方法,在抽象类里使用Singleton模式使用静态方式加载实现层,这可以是一些较大型的应用,比如CommunityServer。优点是规范,性能好,缺点是代码量大,迁移维护较麻烦。

3.         还有就是微软提供的Entriprise Library DAAB模块,用次模块声称可以屏蔽调数据库的异构性。优点是可以尽量减少代码量,缺点是并不能完全屏蔽数据库异构,并没有声称的那么完美,比如Oracle多数据集的返回和其他一些特性,支持的并不好。

4.         Hibernate类似的对象持久化技术。优点是可以可以规范对象和方便的持久层配置,缺点是不太灵活,也不适合在已有的系统中实现。

        上面几种方式都是比较流行的做法,但有缺点和优点并存,作为追求完美的我们,想想能不能做到既可以很好的规范和性能又可以尽量减少代码维护的成本呢,我试着这么做了一下,其实就是折中了一下这几种方案。

        如图,仍然基于上面的分层方法,只是在抽象类里使用了DAAB模块,这样大部分返回单数据集或执行单条语句或执行单独的存储过程的方法都可以在这个抽象模块里使用DAAB模块实现,只有遇到DAAB模块没法解决的时候再在实现层实现。这种情况适合需要同时支持多数据库的系统,并且数据库的数据结构和存储过程名和参数要一致,可以在做完一个数据库后再迁移到另外的数据库系统,迁移工具和方法可以参考这些文章:

http://dragonpro.cnblogs.com/category/27102.html

示例代码:

  • 抽象层代码

抽象类

帮助器类

  •  实现层代码

实现层很简单