大家对微软企业库应该不会感到陌生了,企业库中有一个Data Block,通过它可以进行数据库访问,相当于一个DBHelper的功能。但是它最吸引我的并不是它的DBHelper功能,而是它的数据库无关的特性,用DatabaseFactory创建一个Database对象,注意这个Database是一个抽象类,然后通过Database对象创建Connection和Command,进行数据库访问,同样Connection和Command也是抽象的。所以在我们的DAL层代码中,所使用的都是与具体数据库产品无关的对象。这个很重要,当我们进行数据库迁移时,甚至我们的DAL层代码不需要进行重构。这也是微软所提的Provider模式。
    我也想实现这样的东西,于是就想研究一下企业库,因为开源吗。但是,还是能力不够,发现企业库好复杂,再加上没有找到好的分析企业库的文章,于是就放弃了。没办法,只能靠自己了,那我就得好好研究一下ADO.NET。要做Provider模式还需要有配置信息,于是也研究了ConfiguraionSection。我们都知道Configuration有一个ConnectionString的配置。ConnectionString的配置有name、connectionString、providerName三个东西。providerName就是提供了不同的数据库产品,如SQL就是System.Data.SqlClient。但是System.Data.SqlClient究竟是什么东西呢?查了一下GAC,发现它是一个命名空间,但是感觉不对,个人认为它应该是一个类的信息,如Type设置。那它会不会在Windows的配置文件中呢?打开machine.config文件,惊喜的发行了<system.data>接点下的<DbProviderFactories>有这个东西。仔细一看,原来System.Data.SqlClient只是一个别名,而真实的信息是System.Data.SqlClient.SqlClientFactory,恍然大悟。再看看SqlClientFactory,全都明白了,原来ADO.NET早就已经提供了这种抽象,只是我们所看的ADO.NET的使用教程都没有涉及到而已(也许是本人所看的都是些垃圾书吧)。其实我们使用ADO.NET加系统的配置可以很简单地实现DAL层数据库访问代码的抽象(与具体数据库产品无关)。

ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings[name];
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory( connectionStringSettings.ProviderName );
然后就可以用dbProviderFactory来创建Connection和Command了,至于数据库连接字符串的获得,就不用我再熬述了吧。

希望对您有所帮助,happy codeing.
posted on 2008-11-19 15:07  沈啣结  阅读(596)  评论(0)    收藏  举报