学习BlogEngine.Net解读笔记系列(一)

 

大家好,第一次认真的去解读一个开源作品,或许有很多不对的地方,请大家及时提醒,以便我及时修改,不要越错越多:)

 

大家或许很早就研究过BlogEngine.Net,不过我还是刚刚接触,先前看到博客园的大大说过,BlogEngine.Net是学习Net 2.0最好的开源代码,果不其然,刚看了一个下午,我就迫不及待的想把我的学习体验记录下来,因为实在很好很强大。其实我跟很多人一样,对英文的理解很差,要我看很长的英文书,真的很困难,但代码是共通的,我们可以看国外大师的作品,看他们的代码来学习,这样比看一本英文书来的更实际吧~~~~不过还是建议大家学习好英文:)

 

一、Web.config

1、 数据库链接和选择方式:

<BlogEngine>

    <blogProvider defaultProvider="XmlBlogProvider">

      <providers>

        <add name="XmlBlogProvider" type="BlogEngine.Core.Providers.XmlBlogProvider, BlogEngine.Core"/>

        <add name="MSSQLBlogProvider" type="BlogEngine.Core.Providers.MSSQLBlogProvider, BlogEngine.Core"/>

      </providers>

    </blogProvider>

</BlogEngine>

 

在configuration标签内添加BlogEngine标签,子标签说明:

blogProvider:设定默认数据库选择 defaultProvider

                         XmlBlogProvider:xml作为数据源

                         MSSQLBlogProvider:Ms Sql作为数据源

    Providers:标签内设定数据操作方式的命名空间和类名,可以改为access,自己添加即可

 

数据源为MSSQL或者其他需链接的数据源时,需要在connectionStrings内添加一个变量,变量名为:BlogEngine

 

二、 页面解读:

1、 基本页面BlogBasePage.cs

BlogEngine所有页面都会继承此类,主要的功能是调用模块(Theme)。

作者注释:All pages in the custom themes as well as pre-defined pages in the root

               must inherit from this class.

BlogBasePage.cs会在OnPreInit 和 OnLoad 事件中,加载Theme,然后添加head头内容,更好的为搜索引擎服务。

在OnPreInit事件中,会判断是否是删除帖子的操作,如果是,则删除帖子然后返回到首页。

在OnLoad事件中,你可以自己添加一些内容,或者添加一个公用的js,当然你也可以在模板页面添加。

 

BlogBasePage.cs重写了OnError方法,把所有的错误都归为404错误。。。。

 

BlogBasePage.cs还重写了Render方法,主要是对Url重写的Form Action给予定位,以便能提交到正确的页面。具体可以查看RewriteFormHtmlTextWriter类

 

Translate方法使你能快速便捷的提取Resource资源,BlogEngine已经包含了很多语言资源,大家也可以按照自己的解释来翻译:P

 

2、 大家可以看到在代码中,很多地方出现了BlogSettings.Instance,这个是blog设置的一个公共类,这里的代码很实用,我们来看下。Instance是BlogSettings类的一个公共静态属性,主要的作用是返回一个BlogSettings的实例,微软之前就建议大家,把一些公共的设置都压入到内存中,以便更快更有效的提取。BlogSettings是个配置类,通过几个方法,把博客的配置从数据库或者xml中提取出来,然后用一个私有静态字段给予赋值,它的好处不言而喻,大家可以看一下这里的精华代码。

 

Instance
public static BlogSettings Instance

{

       get

       {

              if (blogSettingsSingleton == null)

              {

                     blogSettingsSingleton = new BlogSettings();

              }

              return blogSettingsSingleton;

       }

}

 

这个属性相信大家也能明白,blogSettingsSingleton是个私有静态字段,如果不为空,会返回blogSettingsSingleton,blogSettingsSingleton其实是个BlogSettings的一个实例。

       如果为空的话,则会重新实例化,BlogSettings()实例化也是私有的,好处大家都知道。在实例化的时候,会调用Load()方法,我们来看下:

 

Load()
private void Load()

              {

                     Type settingsType = this.GetType();

                     System.Collections.Specialized.StringDictionary dic = Providers.BlogService.LoadSettings();

                     foreach (string key in dic.Keys)

                     {

                     

                            string name = key;

                            string value = dic[key];

 

                            foreach (PropertyInfo propertyInformation in settingsType.GetProperties())

                            {

                                   

                                   if (propertyInformation.Name.Equals(name, StringComparison.OrdinalIgnoreCase))

                                   {

                                   

                                          try

                                          {

                                                 propertyInformation.SetValue(this, Convert.ChangeType(value, propertyInformation.PropertyType, CultureInfo.CurrentCulture), null);

                                          }

                                          catch

                                          {

                                                 // TODO: Log exception to a common logging framework?

                                          }

                                          break;

                                   }

                            }

                     }

              }

 

这段代码真的太棒了,我只能用惊叹来形容我自己的表情,先前看了代码之美,总觉得虽然有时候可以让你的代码更优美,但有时候不得不重复打着一定的赋值,让我一直很头疼。不得不静态微软的反射技术,让你的代码能更优美,而且性能也得到了提高。BlogEngine的这段代码就是一个很好的体现,充分利用了反射的作用,可能你会觉得其中用了一个嵌套的循环,会不会影响速度呢?我当时也很疑惑,因为我觉得有更好的方法来替换这个方法的,可作者为什么这么做呢?很简单,记得谁说过,当性能不是问题的时候就不是问题了。因为这里,我们的配置最多最多100个吧,在如今的计算机中,这种循环的性能消耗都能忽略不计了,所以你不用过多的担忧性能,而且,在一定时间内,它也只会产生一次。或许你有更好的方法进行,你也可以自己修改一下代码,我觉得也是对自己的一个提高。

Load()方法会读取配置文件或者数据库,利用反射机制找到对应的属性进行赋值,然后把一个私有变量压入到内存中,这里有些许不灵活,因为你必须把你的字段名或者Xml的节点名与你类里的成员名相匹配。

 

有人说把配置压入内存中有些不方便,因为你随时随地可能进行修改,这时候怎么办呢?不用担心,我们来看看更精妙的Save()方法,他是个公共方法,是为了能让外部进行调用。

 

 

Save()
public void Save()

              {

                     System.Collections.Specialized.StringDictionary dic = new System.Collections.Specialized.StringDictionary();

                     Type settingsType = this.GetType();

                     foreach (PropertyInfo propertyInformation in settingsType.GetProperties())

                     {

                            try

                            {

                                   if (propertyInformation.Name != "Instance")

                                   {

                                          object propertyValue = propertyInformation.GetValue(this, null);

                                          string valueAsString = propertyValue.ToString();

                                          if (propertyValue.Equals(null))

                                          {

                                                 valueAsString = String.Empty;

                                          }

                                          if (propertyValue.Equals(Int32.MinValue))

                                          {

                                                 valueAsString = String.Empty;

                                          }

                                          if (propertyValue.Equals(Single.MinValue))

                                          {

                                                 valueAsString = String.Empty;

                                          }

                                          dic.Add(propertyInformation.Name, valueAsString);

                                   }

                            }

                            catch { }

                     }

 

                     Providers.BlogService.SaveSettings(dic);

                     OnChanged();

              }

你不得不佩服这些大师的作品,区区几十行代码,把你的顾虑都打消了。最后它用了OnChanged()方法,其中它调用了一个事件委托,以便你在保存后,只重新绑定新数据,其他数据的绑定还是从ViewState中提取,实在。。。。说实在的,真的很厉害,如果原先我做,肯定保存后,又全部完全的从配置源里重新读取一边,进行绑定的。突然想到一句话,只修改该修改之数据,精妙啊~~~

 

很多页面上的文字内容都需要自己在页面上修改,我想下一版可能会有所改观吧。

时间: 2024-10-14 14:12:06

学习BlogEngine.Net解读笔记系列(一)的相关文章

从学习途径来解读网站优化难题

摘要: 对于网站优化为什么越来越难,新手要怎样去学习网站优化这些问题大家都谈论的比较多,所以守护也就不再重复了,今天和大家分析的问题是从学习途径来解读网站优化难题,对于各 对于网站优化为什么越来越难,新手要怎样去学习网站优化这些问题大家都谈论的比较多,所以守护也就不再重复了,今天和大家分析的问题是从学习途径来解读网站优化难题,对于各学习途径要采取如何的方式去优化网站.守护建议不管是新手还是SEO资深专员都应该认真读完本篇内容. 大家可能都发现了1月4号的大更新,然而有人欢喜有人愁.各站长类网站论

设计模式学习笔记系列

设计模式学习笔记(二十二)-FlyWeight享元模式 设计模式学习笔记(二十一)-Composite模式 设计模式学习笔记(二十)-Visitor访问者模式 设计模式学习笔记(十九)-Chain of Responsibility职责链模式 设计模式学习笔记(十八)-Mediator中介者模式 设计模式学习笔记(十七)-Memento备忘录模式 设计模式学习笔记(十六)-Proxy模式 设计模式学习笔记(十五)-State模式 设计模式学习笔记(十四)-Command模式 设计模式学习笔记(十

从自动驾驶到学习机器学习:解读2017科技发展的15大趋势

科技在明年将会发生巨大的改变.想要了解前沿资讯吗?著名设计公司 frog 做出的这些预测可能会让你了解一些 2017 年的科技发展趋势.每一个领域都有一个设计师解释全部的细节.哪些东西已经出现在你们的视野中了呢? 1. 自动驾驶领域的超凡表现 目前,我们所了解到的信息是:世界上每年有 120 万人死于车祸,自动驾驶汽车(AVs)在这样的背景之下应运而生.其乐观的前景是可以确定的,因为 90% 以上的交通事故都是由于人类过失造成的,但即使是那些对于自动驾驶最热衷的支持者们也知道自动驾驶汽车有时候也

ADO.NET读书笔记系列之------SqlCommander和SqlDataReader对象

ado|command|笔记|对象 一.特点介绍 ⒈SqlCommand:表示要对SQL Server数据库执行的一个Transact-SQL语句或存储过程. ⒉SqlDataReader:提供一种从数据库读取只进的行流的一种方式.若要创建SqlDataReader,必须调用SqlCommand对象的ExecuteReader方法,而不直接使用构造函数.应该尽可能迅速的关闭SqlDataReader对象. ⒊SqlParameter:表示SqlCommand的参数,也可以是它到DataSet列的

ADO.NET读书笔记系列之------SqlDataAdapter对象

ado|笔记|对象 一.特点介绍 1.表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接. 2.在SqlDataAdapter和DataSet之间没有直接连接.当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了. 二.使用介绍 1.创建SqlDataAdapter     ...     string strSQL="Select * from Customers";     SqlCommand

ADO.NET读书笔记系列之------DataSet对象

ado|笔记|对象 一.特点介绍 1.处理脱机数据,在多层应用程序中很有用. 2.可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法. 3.处理分级数据 4.缓存更改 5.XML的完整性:DataSet对象和XML文档几乎是可互换的. 二.使用介绍 1.创建DataSet对象:DataSet ds = new DataSet("DataSetName"); 2.查看调用SqlDataAdapter.Fill创建的结构     da.Fill(ds,"Ord

今日笔记系列之Castor

笔记 近日对java对象与xml文本的相互转换有一定兴趣,于是乎在网上查看了一下相关的资料.发现了castor. 并浏览了该页面http://www.jdon.com/idea/castor.htm,但发现上面的代码有一些错漏. 自己用eclipse写了一个简单的代码如下:(主要参考了上面提到的网站的内容) 该程序是读入page.xml文件,然后转化为java对象.接着把java对象写到另外一个文件里. **********************************************

今日笔记系列之Log4J

笔记 今天看了一下<tomcat与java web开发技术详解>的第十七章,简单地了解了Log4J的基本用法. 1.log4j.jar包,把他放到classpath里 2.配置文件,这里列举其中一种,*.properties方式的,文件如下 .................................... #log.properties #Logger组件log4j.rootLogger=warn,consolelog4j.logger.first=error,consolelog4j

《Mastering Opencv ...读书笔记系列》车牌识别(II)

   继上一篇文章后,现在要做的就是从车牌图像上使用optical character recognition算法将字符提取出来.对于每一块被检测的车牌,使用带监督的神经网络机器学习算法来识别字符. 本文内容: 1.字符分割  2.神经网络训练方法 3.使用神经网络预测字符 一.字符分割[OCR Segment] 在使用神经网络对每个字符进行预测之前,我们必须从车牌图像中扣取改字符图片,因此有如下步骤: 本文的输入图像为上一篇文章的车牌: a.二值化车牌 b.求轮廓 c.求最小外接矩形 d.用纵