代码改变世界

Subtext--数据库操作

2007-04-07 21:07  Clingingboy  阅读(1940)  评论(2编辑  收藏  举报
        Subtext的数据模型仍然是现有.net推荐的Provider模式,Provider模式具体可以参考以下两篇文章

设计模式 - Provider Pattern(提供者模式)

.NET 2.0的Provider模式

下面来看下Subtext的数据库操作设计模型




DbProvider为抽象类,其定义了所有与数据操作相关的接口,SqlDataProvider则具体实现,其中如果是返回数据对象为IDataReader或者DataTable,接着是ObjectProvider,其定义的接口跟DbProvider差不多,但其返回的数据是一个真正的实体或集合了。DatabaseObjectProvider会调用SqlDataProvider的接口,然会再进行转换。
接着再把实现的接口分摊,拆分。如Link的操作,则定义一个Links静态类,再调用DatabaseObjectProvider的接口,便于用户明确的调用接口,不然直接调用DatabaseObjectProvider,接口太多,可能会有点晕晕。不过个人感觉,这样的封装实在有点麻烦,特别是DbProvider可以直接处理,返回一个实体类型或集合。
其中还应用了Microsoft.ApplicationBlocks.Data .

看一个应用吧,用代码说明一切。该省的就省了吧

1.

        public override IDataReader GetLinkReader(int linkID)
        
{
            SqlParameter[] p 
= 
            
{
                DataHelper.MakeInParam(
"@LinkID",SqlDbType.Int,4,linkID),
                BlogIdParam
            }
;
            
return GetReader("subtext_GetSingleLink", p);
        }

2.GetReader会使用Microsoft.ApplicationBlocks.Data的接口

        private IDataReader GetReader(string sql)
        
{
            LogSql(sql, 
null); 
            
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, sql);
        }

3.到了DatabaseObjectProvider

        public override Link GetLink(int linkID)
        
{
            IDataReader reader 
= DbProvider.Instance().GetLinkReader(linkID);
            
try
            
{
                Link link 
= null;
                
while(reader.Read())
                
{
                    link 
= DataHelper.LoadLink(reader);
                    
break;
                }

                
return link;
            }

            
finally
            
{
                reader.Close();
            }
            
        }

4.DataHelper为辅助类,其帮助你把数据库数据读出来传给实体对象



5.Links

        public static Link GetSingleLink(int linkID)
        
{
            
return ObjectProvider.Instance().GetLink(linkID);
        }

Ok,完成,接着你便是调用GetSingleLink这个方法

其他的差不多。数据库操作差不多就这样。