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.
2.GetReader会使用Microsoft.ApplicationBlocks.Data的接口
3.到了DatabaseObjectProvider
4.DataHelper为辅助类,其帮助你把数据库数据读出来传给实体对象
public static Link LoadLink(IDataReader reader)
{
Link link = new Link();
// Active cannot be null
link.IsActive = (bool)reader["Active"];
if(reader["NewWindow"] != DBNull.Value)
{
link.NewWindow = (bool)reader["NewWindow"];
}
// LinkID cannot be null
link.Id = ReadInt32(reader, "LinkID");
if(reader["Rss"] != DBNull.Value)
{
link.Rss = ReadString(reader, "Rss");
}
if(reader["Url"] != DBNull.Value)
{
link.Url = ReadString(reader, "Url");
}
if(reader["Title"] != DBNull.Value)
{
link.Title = ReadString(reader, "Title");
}
if(reader["CategoryID"] != DBNull.Value)
{
link.CategoryID = ReadInt32(reader, "CategoryID");
}
if(reader["PostID"] != DBNull.Value)
{
link.PostID = ReadInt32(reader, "PostID");
}
return link;
}
5.Links
Ok,完成,接着你便是调用GetSingleLink这个方法
其他的差不多。数据库操作差不多就这样。
设计模式 - 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);
}
{
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);
}
{
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();
}
}
{
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为辅助类,其帮助你把数据库数据读出来传给实体对象
public static Link LoadLink(IDataReader reader)
{
Link link = new Link();
// Active cannot be null
link.IsActive = (bool)reader["Active"];
if(reader["NewWindow"] != DBNull.Value)
{
link.NewWindow = (bool)reader["NewWindow"];
}
// LinkID cannot be null
link.Id = ReadInt32(reader, "LinkID");
if(reader["Rss"] != DBNull.Value)
{
link.Rss = ReadString(reader, "Rss");
}
if(reader["Url"] != DBNull.Value)
{
link.Url = ReadString(reader, "Url");
}
if(reader["Title"] != DBNull.Value)
{
link.Title = ReadString(reader, "Title");
}
if(reader["CategoryID"] != DBNull.Value)
{
link.CategoryID = ReadInt32(reader, "CategoryID");
}
if(reader["PostID"] != DBNull.Value)
{
link.PostID = ReadInt32(reader, "PostID");
}
return link;
}
5.Links
public
static
Link GetSingleLink(
int
linkID)
{
return ObjectProvider.Instance().GetLink(linkID);
}
{
return ObjectProvider.Instance().GetLink(linkID);
}
Ok,完成,接着你便是调用GetSingleLink这个方法
其他的差不多。数据库操作差不多就这样。