第一个问题解决了,只剩下最后一个问题了,如何动态切换不同的数据库,也就是说,在使用的时候不需要自己NEW一个对象,而是通过第三方来创建一个对象,实际上,设计模式里已提出了方案,创建型模式,有兴趣的朋友可以自行研究,我们这里只需要用到简单工厂模式:
- public sealed class ExecutorFactory
- {
- public static DataExecutor Create()
- {
- return Create(DatabaseType.MSSql);
- }
- public static DataExecutor Create(DatabaseType dbType)
- {
- AbstractDataBase dataBase = null;
- Switch(dbType)
- {
- case DatabaseType.MSSql:
- dataBase = new MSSqlDataBase();
- break;
- case DatabaseType.Oracle:
- dataBase = new OracleDataBase();
- break;
- }
- return dataBase.Create();
- }
- }
|
现在可对这句代码进行替换了:DataExecutor execObj = new MSSqlExecutor();
替换为:DataExecutor execObj = ExecutorFactory.Create();
至此,问题都解决了,切换数据库是只需更改DatabaseType为相应的数库类型。
接下来再考虑下,如果改变数据库类型也不需要变动程序,能不能实现?
还是利用配置文件,只是此时提供的不是类型字串,而是实际的数据执行者程序集信息,再利用.NET的天然优势反射可以实现了。
最终配置文件为:
- <appSettings>
- <add key="ConnStr" value="server=.;uid=sa;password=123456;database=DATA_BASE;max pool size=300"/>
- <add key="DBExecutor" value="FM.DataAccess, FM.DataAccess.MappingExcuter.MSSqlExecutor"></add>
- </appSettings>
|
改造后的工厂:
- public sealed class ExecutorFactory
- {
- public static DataExecutor Create()
- {
- return Create(null);
- }
- public static DataExecutor Create(string dataBaseTypeKey)
- {
- return Create(dataBaseTypeKey, null);
- }
- public static DataExecutor Create(string dataBaseTypeKey, string connStrKey)
- {
- if (string.IsNullOrEmpty(dataBaseTypeKey))
- {
- dataBaseTypeKey = "DBExecutor";
- }
- string[] sltDataBaseType = ConfigReader.Read(dataBaseTypeKey).Split(',');
- string asselblyName = sltDataBaseType[0];
- string nameSpace = sltDataBaseType[1].Trim();
- Assembly assembly = Assembly.Load(asselblyName);
- DataExecutor execObj = assembly.CreateInstance(nameSpace) as DataExecutor;
- execObj.SetConnectionString(connStrKey);
- return execObj;
- }
- }
|
到此为止,数据访问层最终完成,当然这里还有很多问题有待解决,但其基本框架已形成了,以此为依据,根据业务变化,实现自己的扩展,不断更新,最终才能真正形成完善的数据访问层。
相关链接:
打造自己的数据访问层一
如何打造自己的数据访问层二