小菜梦游Discuz!NT (第八篇 数据层设计4)
2008-07-19 21:23
267 查看
话说小菜已经做到了支持多数据库的大体设计了.
老大来看小菜,看小菜的进步如何.
看到小菜的设计之后,老大给予了一定的肯定,但还是少不了一些意见.
1)老大对小菜的ForumManage的代码极其不满意.
public class ForumFactory
using System;
using System.Reflection;
using Discuz.Config;
namespace Discuz.Data
using System;
using System.Reflection;
using Discuz.Config;
namespace Discuz.Data
那我们的调用方式也要从IForumManage forum = ForumFactory.CreateForumManage();
改为IForumManage forum = ForumFactory.CetInstance();
其实单件的实现方式有三种,一,二两种比较常见,第三种比较少见,不过却是最好的,上面的代码是第一种.
大家可以参考怪怪的一篇随笔: 对Singleton的实现方法做一个总结
或者直接看这篇 http://www.yoda.arachsys.com/csharp/singleton.html (写的更细心,不过是英文的)
对噢.老大的意见还没说完呢! :)
2)小菜啊,你看代码中的SqlHelper与AccessHelper代码重复太多,而且完成的功能基本类似,所以你得考虑下重构下他们俩兄弟.(老大还给了小菜一个提示: System.Data.Common中已经为我们提供了帮助,可以去看看)
小菜重新打开了System.Data.Common的源码. (发现了如下的代码组织,这不是抽象工厂模式吗.)
public sealed class SqlClientFactory : DbProviderFactory
public sealed class OleDbFactory : DbProviderFactory
using System;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Data.SqlClient;
using Discuz.Config;
namespace Discuz.Data
看来小菜的工作并不会太难,因为有了DbProviderFactory,SqlClientFactory,OleDbFactory的帮助,当然还有个静态构造函数.
将下来,当然是使用它啦.还是老例子,那两个.
1)遍历dnt_forums表,输出fid,name
2)<a href="GetForumName.aspx?fid=1">取得版块名称</a>
IForumManage接口
using System;
using System.Data;
namespace Discuz.Data
Sql数据库实现
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace Discuz.Data.SqlServer
Access数据库实现
using System;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
namespace Discuz.Data.Access
接下来是什么呢?当然是使用下它们啊. 遍历dnt_forums表
using System;
using System.Data;
using Discuz.Data;
public partial class _Default : System.Web.UI.Page
按fid取版块名称
using System;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using Discuz.Data;
public partial class GetForumName : System.Web.UI.Page
现在如果是使用Sql数据库就将DNT.config中的DbType结点修改为<DbType>SqlServer</DbType>
现在如果是使用Access数据库就将DNT.config中的DbType结点修改为<DbType>Access</DbType>
咦,看那头的小菜在沉思.在沉思什么呢? 小菜在想还有哪些不足,还有哪些重复.(这可是个好兆头啊.我们设计一个阶段最好就要进行一次代码重构.)
1)问题1: 数据库连接字符串,我们在配置处理部份中已经将它放在了DNT.config的<DbConnectString></DbConnectString>结点中
所以我们可以使用BaseConfigFileManager.GetDbConnectString来替换数据库连接字符串
"Data Source=(local);User ID=sa;Password=password;Initial Catalog=discuz;Pooling=true"
和"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
HttpContext.Current.Server.MapPath("~/database/access_db.config")
当然Access数据库连接字符串,我们可以在安装时,将 "~/database/access_db.config"
转换成绝对路径放入DNT.config中
代码现在为private static string m_connString = BaseConfigFileManager.GetDbConnectString;
2)问题2: sql语句"select fid,name from dnt_forums"中表的dnt_这个前缀,我们在配置处理部份中也已经将它放在了DNT.config的<TablePrefix></TablePrefix>结点中
所以我们可以用string.Format("select fid,name from {0}forums", BaseConfigFileManager.GetTablePrefix);
来替换上面的sql语句了.
3)问题3: 如果添加了MySql数据库的支持,那么DbHelper的代码,我们又需要修改为
namespace Discuz.Data
{
{
{
{
case "Access":
m_factory = OleDbFactory.Instance;
break;
case "SqlServer":
m_factory = SqlClientFactory.Instance;
break;
case "MySql":
m_factory = MySqlClientFactory.Instance;
break;
default:
throw new Exception("暂不支持其它数据库类型");
}
}
其它略,同上
}
}
这个需求是成立的,因为MySql做为现在最流行的数据库之一,已经被Discuz!NT支持.
不过需要添加它的组件MySql.Data.dll
然后using MySql.Data.MySqlClient; 便可支持上面的MySqlClientFactory.Instance
如果支持Oracle数据库呢?,看来switch又得加长.......但可喜的是数据库流行的种类并不算太多.所以switch也不可能太长.
但还有一点值得我们注意的:
Access和MySql不支持存储过程,Sql支持
Access和MySql不支持数据库备份,Sql支持
Access和Sql不支持优化,MySql支持
Access和MySql不支持全文搜索,Sql支持
等等,,数据库之前的差异,那么我们为何不顺水推舟呢.把上面的switch(){....}这个毒瘤一块干掉呢.
那下篇咱们就来动动手术吧.
休息,,休息
老大来看小菜,看小菜的进步如何.
看到小菜的设计之后,老大给予了一定的肯定,但还是少不了一些意见.
1)老大对小菜的ForumManage的代码极其不满意.
public class ForumFactory
using System;
using System.Reflection;
using Discuz.Config;
namespace Discuz.Data
using System;
using System.Reflection;
using Discuz.Config;
namespace Discuz.Data
那我们的调用方式也要从IForumManage forum = ForumFactory.CreateForumManage();
改为IForumManage forum = ForumFactory.CetInstance();
其实单件的实现方式有三种,一,二两种比较常见,第三种比较少见,不过却是最好的,上面的代码是第一种.
大家可以参考怪怪的一篇随笔: 对Singleton的实现方法做一个总结
或者直接看这篇 http://www.yoda.arachsys.com/csharp/singleton.html (写的更细心,不过是英文的)
对噢.老大的意见还没说完呢! :)
2)小菜啊,你看代码中的SqlHelper与AccessHelper代码重复太多,而且完成的功能基本类似,所以你得考虑下重构下他们俩兄弟.(老大还给了小菜一个提示: System.Data.Common中已经为我们提供了帮助,可以去看看)
小菜重新打开了System.Data.Common的源码. (发现了如下的代码组织,这不是抽象工厂模式吗.)
public sealed class SqlClientFactory : DbProviderFactory
public sealed class OleDbFactory : DbProviderFactory
using System;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Data.SqlClient;
using Discuz.Config;
namespace Discuz.Data
看来小菜的工作并不会太难,因为有了DbProviderFactory,SqlClientFactory,OleDbFactory的帮助,当然还有个静态构造函数.
将下来,当然是使用它啦.还是老例子,那两个.
1)遍历dnt_forums表,输出fid,name
2)<a href="GetForumName.aspx?fid=1">取得版块名称</a>
IForumManage接口
using System;
using System.Data;
namespace Discuz.Data
Sql数据库实现
using System;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
namespace Discuz.Data.SqlServer
Access数据库实现
using System;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
namespace Discuz.Data.Access
接下来是什么呢?当然是使用下它们啊. 遍历dnt_forums表
using System;
using System.Data;
using Discuz.Data;
public partial class _Default : System.Web.UI.Page
按fid取版块名称
using System;
using System.Web;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using Discuz.Data;
public partial class GetForumName : System.Web.UI.Page
现在如果是使用Sql数据库就将DNT.config中的DbType结点修改为<DbType>SqlServer</DbType>
现在如果是使用Access数据库就将DNT.config中的DbType结点修改为<DbType>Access</DbType>
咦,看那头的小菜在沉思.在沉思什么呢? 小菜在想还有哪些不足,还有哪些重复.(这可是个好兆头啊.我们设计一个阶段最好就要进行一次代码重构.)
1)问题1: 数据库连接字符串,我们在配置处理部份中已经将它放在了DNT.config的<DbConnectString></DbConnectString>结点中
所以我们可以使用BaseConfigFileManager.GetDbConnectString来替换数据库连接字符串
"Data Source=(local);User ID=sa;Password=password;Initial Catalog=discuz;Pooling=true"
和"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
HttpContext.Current.Server.MapPath("~/database/access_db.config")
当然Access数据库连接字符串,我们可以在安装时,将 "~/database/access_db.config"
转换成绝对路径放入DNT.config中
代码现在为private static string m_connString = BaseConfigFileManager.GetDbConnectString;
2)问题2: sql语句"select fid,name from dnt_forums"中表的dnt_这个前缀,我们在配置处理部份中也已经将它放在了DNT.config的<TablePrefix></TablePrefix>结点中
所以我们可以用string.Format("select fid,name from {0}forums", BaseConfigFileManager.GetTablePrefix);
来替换上面的sql语句了.
3)问题3: 如果添加了MySql数据库的支持,那么DbHelper的代码,我们又需要修改为
namespace Discuz.Data
{
{
{
{
case "Access":
m_factory = OleDbFactory.Instance;
break;
case "SqlServer":
m_factory = SqlClientFactory.Instance;
break;
case "MySql":
m_factory = MySqlClientFactory.Instance;
break;
default:
throw new Exception("暂不支持其它数据库类型");
}
}
其它略,同上
}
}
这个需求是成立的,因为MySql做为现在最流行的数据库之一,已经被Discuz!NT支持.
不过需要添加它的组件MySql.Data.dll
然后using MySql.Data.MySqlClient; 便可支持上面的MySqlClientFactory.Instance
如果支持Oracle数据库呢?,看来switch又得加长.......但可喜的是数据库流行的种类并不算太多.所以switch也不可能太长.
但还有一点值得我们注意的:
Access和MySql不支持存储过程,Sql支持
Access和MySql不支持数据库备份,Sql支持
Access和Sql不支持优化,MySql支持
Access和MySql不支持全文搜索,Sql支持
等等,,数据库之前的差异,那么我们为何不顺水推舟呢.把上面的switch(){....}这个毒瘤一块干掉呢.
那下篇咱们就来动动手术吧.
休息,,休息
相关文章推荐
- 小菜梦游Discuz!NT (第七篇 数据层设计3)
- 小菜梦游Discuz!NT (第九篇 数据层设计5)
- 小菜梦游Discuz!NT (第五篇 数据层设计1)
- 小菜梦游Discuz!NT (第六篇 数据层设计2)
- 小菜梦游Discuz!NT (第一篇 开篇有益)
- Discuz!NT中的Redis架构设计
- .Net下的分布式缓存--从Discuz!NT的缓存设计谈起
- Discuz!NT中的Redis架构设计
- 一起谈.NET技术,Discuz!NT 缓存设计简析 [原创]
- DiscuzNT 商品交易插件设计之用例模型
- .Net下的分布式缓存--从Discuz!NT的缓存设计谈起[转贴]
- Discuz!NT 缓存设计简析
- Discuz!NT 的相关设计文章
- .Net下的分布式缓存--从Discuz!NT的缓存设计谈起[原创][转]
- Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
- Discuz!NT 缓存设计简析
- Discuz!NT 缓存设计简析 [原创]
- Discuz!NT中的Redis架构设计
- Discuz!NT控件剖析 之 DataGrid(数据列表) [原创: 附源码]
- 小菜的系统框架界面设计-数据的完美呈现(DataGridView扩展)