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

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
人人都是产品经理
人人都是产品经理
H
Heimdal Security Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
雷峰网
雷峰网
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
A
About on SuperTechFans
V2EX - 技术
V2EX - 技术
小众软件
小众软件
博客园 - Franky
博客园 - 司徒正美
P
Privacy International News Feed
爱范儿
爱范儿
U
Unit 42
博客园 - 叶小钗
The Hacker News
The Hacker News
C
Check Point Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Simon Willison's Weblog
Simon Willison's Weblog
N
News and Events Feed by Topic
D
Docker
T
Threatpost
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Help Net Security
L
LINUX DO - 最新话题
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
A
Arctic Wolf
Spread Privacy
Spread Privacy

博客园 - 阿修罗一平

IIS部署WCF出现的各种问题汇总 Infragistics控件的工具栏注册 NUnit的使用中可能遇到的问题 Linq备忘 Nihibernate的重要知识点 Devexpress使用记录 使用List数据集合,利用DevExpress.XtraReports开发Master-Detail报表 PDA访问WCF PDA(WinCE)项目开发中遇到的问题及解决方法总结 Grid控件绑定bindingSource后在新增行时设置Cell的初始值 “BindingSource绑定单个实体对象后在代码中赋值无效和无法显示”的解决方法 sqlservier2005转成sqlserver2000中出现的问题(WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) 项目考虑因素及解决方案(.net) 设计模式在工作中的应用(三) 设计模式在工作中的应用(一) NHibernate示例 Remoting服务集成到IIS的简单总结 关于Remoting服务启动和停止的简单总结 将公司系统从SqlServer 2K移植到Oracle 10g中的简要总结
设计模式在工作中的应用(二)
阿修罗一平 · 2007-10-12 · via 博客园 - 阿修罗一平
    

    系统数据层采用O/R mapping技术实现的,今天的重点不是介绍如何实现数据层,而是讲述数据层其中的一个需求。什么需求呢?就是在在最后解析的Sql语句中需要支持SqlServer的函数,比如将字符串转换为时间、截取字符串的字段,这些功能在SqlServer中有对应的函数来完成。需要说明的是Sql语句不是程序中写入的,而是通过实体按照不同的操作解析生成的。所以还不能直接增加数据库的函数。

这里我们不介绍如何进行解析生成Sql语句,怎么解析的不重要,只要知道这些都是解析类,转换为Sql语句的不同部分。我是想说说针对上面的需求,我是如何考虑的。

需要能够使用SqlServer的函数?大概想一想,感觉很容易啊,不就是封装一个函数类,实现SqlServer数据库的函数。是的,最根本的实现也就是这些。那还有什么需要考虑的呢?那就来找找什么是变化的。首先想到的肯定是不同的数据库,能支持SqlServer数据库,当然也得考虑扩展到Oracle数据库, 这样就找到一个变化点。(没办法,公司系统主要是MIS,所以动不动就要关心不同的数据库)支持不同数据库,没问题,每个函数都实现不就好了吗,没什么大不了的。打开数据库函数列表,我晕,一大堆,如果都要实现,我看这个框架也就别做了,忙着实现这些函数功能就好了。而且,现在也不知道以后的新系统会用到哪些函数。最常用的函数肯定需要实现,用的多啊。如果哪天需要用到一个新的数据库函数而又数据层又没有实现,怎么办?有办法,修改函数类,增加一个方法即可。嗯,不错,解决了问题。问题是,一个、两个可以,日子长了,不得改个没完。所以数据库不断增加的函数是第二个变化点。

暂时只找到了两个变化点,现在该如何来封装这两个变化点?我是这样来做的,针对不同数据库,采用了strategy模式,这样可以实现不同数据的函数解析。第二个变化点,为了能动态的支持数据库的函数,选择了visitor模式,这样在实现了常用函数后不用担心修改不断增加的数据库函数了。
   
    好了,下周继续。

对了,简图如下: