首页 走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析之Provider的初始化

举报
开通vip

走进Linq-Linq to SQL源代码赏析之Provider的初始化走进Linq-Linq to SQL源代码赏析之Provider的初始化 话说Linq to SQL理论上应该支持多种数据库的,而且应该支持多种数据库,到最后却落的 这个局面,是为了商业考虑还是本来技术就不成熟?不得而知。不过不管怎么说Linq to SQL 的体系结构确实是支持扩展的。 在System.Data.Linq.Mapping这个命名空间下微软提供了一个特性:ProviderAttribute, 使用强类型的DataContext或使用Xml做映射的时候,该特性可以用来指定具体的数据库提 供者。如下...

走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析之Provider的初始化 话说Linq to SQL理论上应该支持多种数据库的,而且应该支持多种数据库,到最后却落的 这个局面,是为了商业考虑还是本来技术就不成熟?不得而知。不过不管怎么说Linq to SQL 的体系结构确实是支持扩展的。 在System.Data.Linq.Mapping这个命名空间下微软提供了一个特性:ProviderAttribute, 使用强类型的DataContext或使用Xml做映射的时候,该特性可以用来指定具体的数据库提 供者。如下: [Database(“dbo.cnblogs”)] [Provider(typeof(SqlProvider))] Public CnBlogDataContext : DataContext { } 这就 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 明我们的Linq to SQL是基于Sql Server数据库了,SqlProvider是实现了IProvider 接口的(该接口存在于System.Data.Linq.Provider命名空间下)。 在DataContext初始化时执行的Init方法里有这样几行代码: if (model.ProviderType == null) { throw Error.ProviderTypeNull(); } Type providerType = model.ProviderType; if (!typeof(IProvider).IsAssignableFrom(providerType)) { throw Error.ProviderDoesNotImplementRequiredInterface(providerType, typeof(IProvider)); } this.provider = (IProvider) Activator.CreateInstance(providerType); this.provider.Initialize(this.services, connection); 这里是根据model的ProviderType创建一个IProvider的实例。Model就是一个MetaModel 对象。前面两篇都提到了MetaModel有两个子类,AttributeMetaModel和XmlMetaModel,看 看你是用哪种方法做映射的,我们这里就用AttributeMetaModel做例子,在AttributeMetaModel的构造 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 里有这样几行代码: ProviderAttribute[] customAttributes = (ProviderAttribute[]) this.contextType.GetCustomAttributes(typeof(ProviderAttribute), true); if ((customAttributes != null) && (customAttributes.Length == 1)) { this.providerType = customAttributes[0].Type; } else { this.providerType = typeof(SqlProvider); } 从DataContext类上找Provider特性,如果没有找到就默认使用SqlProvider了。创建了IProvider的实例就会调用它的Initialize方法进行初始化。Initialize方法需要两个参数IDataService和一个连接对象(DbConnection或是连接字符串)。 关于 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 模式的旁白 桥接模式 看到这里也许大家都说,哦,原来实际的事情都是这个IProvider干的啊,IProvide是个接口,下面可能有SqlProvider,OracleProvider,AccessProvider,只要提供这些Provider我们就可以无限扩展数据库了。是的,设计到这一步已经可以满足多数据库的要求了,但是 数据库种类的多样性只是一个方面,还有每种数据库版本的差异呢?如果我们就使用继承, 就这样无限的去扩展,最后会得到一个很复杂的类层次,层次搞复杂后不仅仅难于重构,更 要的是会出现很多重复,灵活性也降低了。 如果光使用继承,我们可能会得到这样的继承树: 这样的继承层次看起来貌似很“专业”,但是灵活性实在是不敢恭维,首先,任何一个层次 的小小变动在整个继承链上都要改动,如果增加一种数据库,而这种数据有会有几种版本, 各个版本之间又有些差异,那么类的数量会成倍增长。还有一个,那就是子类之间有可能造 成重复,假如Sql2000Provider和Oracle9iProvider之间有重复怎么办?C#又不支持多继承,我们无法使用Martin Folwer的重构方法将子类重复的部分提升到父类。那有什么好办法呢? 看看微软的设计师是怎么干的。 IProvder的初始化方法Initialize需要两个参数,其中一个就是一个IDataService接口(注意,这里是接口,那肯定有很多实现,不过由于Linq to SQL就支持一种数据库,现在也只有一种实现了,不过我们可以通过这种形式来想象和扩展,并可以学习这种理念),这个时候 我们得到的是另外一种类图: (点击看完整大图) 这里以组合的方式,组合Provider和IDataService,类的继承层次简明了很多,也可以很 容易处理子类之间的重复了。 实际上这就是桥接模式,该模式的意图是抽象和实现相分离,在这里IProvider就是抽象,而IDataService这边就是实现了。通过IDataService这个接口,把SqlProvider和CommonDataService,DBProvider和DBDataService之间的依赖消除了。仔细体会一下,我 们的实际项目中在哪些地方出现过这样的场景?不久以前我发了一篇博客《重构到Brdge模式》,那里描述了我实际项目中一个真实的场景。 请注意的是,实际的Linq to SQL因为只支持SQL Server,所以上面的类图描述的关系并不 存在,但是我们从代码中完全可以想象的到即使要扩展也是很容易的,这就是架构的力量, 即使是昨天的设计也能应付明天的变化。 关于Provider的初始化就介绍到这里了,在文章末尾的源代码 下载 课程表模板下载资产负债表下载英语单词下载学习机资料下载励志文章下载 里提供了IProvider类和SqlProvider类,你可以看看初始化的过程,并联系上面的图想想如何构建一个可扩展的架 构。
本文档为【走进Linq-Linq to SQL源代码赏析之Provider的初始化】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_477730
暂无简介~
格式:doc
大小:16KB
软件:Word
页数:0
分类:互联网
上传时间:2017-12-21
浏览量:10