走进Linq-Linq to SQL源代码赏析之Provider的初始化
[2] 走进Linq-Linq to SQL源代码赏析之Provider的初始化
[3] 走进Linq-Linq to SQL源代码赏析之Provider的初始化
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
关于设计模式的旁白
桥接模式
看到这里也许大家都说,哦,原来实际的事情都是这个IProvider干的啊,IProvide是个接口,下面可能有SqlProvider,OracleProvider,AccessProvider,只要提供这些Provider我们就可以无限扩展数据库了。是的,设计到这一步已经可以满足多数据库的要求了,但是数据库种类的多样性只是一个方面,还有每种数据库版本的差异呢?如果我们就使用继承,就这样无限的去扩展,最后会得到一个很复杂的类层次,层次搞复杂后不仅仅难于重构,更要的是会出现很多重复,灵活性也降低了。
如果光使用继承,我们可能会得到这样的继承树:
这样的继承层次看起来貌似很“专业”,但是灵活性实在是不敢恭维,首先,任何一个层次的小小变动在整个继承链上都要改动,如果增加一种数据库,而这种数据有会有几种版本,各个版本之间又有些差异,那么类的数量会成倍增长。还有一个,那就是子类之间有可能造成重复,假如Sql2000Provider和Oracle9iProvider之间有重复怎么办?C#又不支持多继承,我们无法使用Martin Folwer的重构方法将子类重复的部分提升到父类。那有什么好办法呢?看看微软的设计师是怎么干的。