随笔 - 547  文章 - 213 评论 - 417 阅读 - 107万

CommunityServer中的Provider模式的应用


Provider的优势:
不关心具体实现
支持多数据库
方便文档描述交流
有利于团队协作分工


下图是程序的结构。



                                 图1

下面给出具体的程序示例:


Blogs\Controls\Admin\BlogFeedbackAdmin.cs文件中的一个方法:

        /// <exclude />
        public override void DataBind() 
        {
            
base.DataBind ();

            
this.FeedbackList.DataKeyField = "PostID";
            Int32 totalRecords;
            
this.FeedbackList.DataSource = BlogFeedback.GetFeedback( this.CurrentWeblog.SectionID, GridPager.PageIndex, this.GridPager.PageSize, out totalRecords );
            
//this.FeedbackList.VirtualItemCount = totalRecords;
            this.GridPager.TotalRecords = totalRecords;
            
this.FeedbackList.DataBind();
        }


这里用到了一个 BlogFeedback类,这个类的代码在CommunityServer.Blogs.ComponentsBlogFeedback.cs文件中:

 

 

 

BlogFeedback.cs的源代码

 

 

注意此文件的

 

        /// <summary>

        
/// Gets a paged set of feedback items for the given weblogs

        
/// </summary>

        
/// <returns>Returns an ArrayList of FeedBackItem objects.</returns>

        
public static ArrayList GetFeedback( Int32 blogId, Int32 pageIndex, Int32 pageSize, out Int32 totalRecords ) 

        {

            WeblogDataProvider wdp 
= WeblogDataProvider.Instance();

            
return wdp.GetFeedback( blogId,pageIndex, pageSize, out totalRecords);

        }

 

 
以上部分对应图1的Components



在这个文件中的WeblogDataProvider类就是DataProvider抽象类,下面看看这个类的类图:

下面是这个类的源代码:

 

 

 

可以看到,这个类是抽象类,类中除了构造函数和Instance方法以及画实现的方法以外,其余的都是抽象方法。构造函数和

Instance方法的作用已经在CommunityServerBlogs/BlogFeedback.cs文件分析中论述过。

以上部分对应图1中的Data Provider APIs部分




 

 

DataProvider API的实现类:CommunityServer.Data中的WeblogSqlDataProvider.cs文件:

 

 

下面看看其中的一个具体的方法:


        /// <summary>
        
/// Returns blog comments/trackbacks
        
/// </summary>
        public override ArrayList GetFeedback(int forumID, int pageIndex, int pageSize, out int totalRecords)
        {
            ArrayList feedback 
= new ArrayList();

            
using ( SqlConnection cn = GetSqlConnection() )
            
using ( SqlCommand cmd = new SqlCommand( databaseOwner + ".cs_weblog_Feedback_Get", cn ) ) 
            {
                cmd.CommandType 
= CommandType.StoredProcedure;

                cmd.Parameters.Add(
"@SectionID", SqlDbType.Int).Value = forumID;
                cmd.Parameters.Add(
this.SettingsIDParameter());
                cmd.Parameters.Add(
"@TotalRecords", SqlDbType.Int ).Direction = ParameterDirection.Output;
                
if ( pageSize > 0 ) 
                {
                    cmd.Parameters.Add( 
"@UsePaging", SqlDbType.Bit ).Value = true;
                    cmd.Parameters.Add( 
"@PageSize", SqlDbType.Int ).Value = pageSize;
                    cmd.Parameters.Add( 
"@PageIndex", SqlDbType.Int ).Value = pageIndex;
                }
                
                cn.Open();
                
using(SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {

                    
// PostID, PostAuthor, Subject, PostDate, IsApproved, PostName, TitleUrl
                    while ( dr.Read() ) 
                    {
                        BlogFeedbackItem item 
= new BlogFeedbackItem();
                    
                        item.PostID 
= (Int32)dr[ "PostID" ];
                        item.PostAuthor 
= (String)dr[ "PostAuthor" ];
                        item.Subject 
= (String)dr[ "Subject" ];
                        item.IsApproved 
= (Boolean)dr[ "IsApproved" ];
                        item.TitleUrl 
= dr[ "TitleUrl" ] as String;
                        item.PostDate 
= (DateTime)dr[ "PostDate" ];
                        item.Body 
= dr[ "Body" ] as String;

                        feedback.Add( item );
                    }

                    dr.Close();
                }
                cn.Close();
                totalRecords 
= (Int32)cmd.Parameters[ "@TotalRecords" ].Value;

               
            }

            
return feedback;
        }



 

相关方法:

 

        protected SqlConnection GetSqlConnection () 
        {

            
try 
            {
                
return new SqlConnection(ConnectionString);
            } 
            
catch 
            {
                
throw new CSException(CSExceptionType.DataProvider, "SQL Connection String is invalid.");
            }

        }

 
以上部分对应图1中的Data Provider APIs



可以看到,每次执行
GetFeedback方法的时候,都打开一个新的数据库连接,然后操作数据库。操作完成后关闭数据库连接。(我想这样可能产生一个问题,就是如果在线人数很多的时候,就会有很多的数据库连接,这样可能会导致程序运行缓慢,是否可以采用Singleton模式的变种来控制数据库连接的数量?



参考资料:CommunityServer架构分析,作者:宝玉(http://blog.joycode.com/dotey;http://www.communityserver.cn  )

 

posted on   今夜太冷  阅读(664)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示