• BlogEngine.netBlogSettings


    对于博客配置,BlogEngine由一个全局配置类BlogSettings来操作,关于BlogSettings,它采用了单例设计

    singleton
     1 ///<summary>
    2 /// The blog settings singleton.
    3 ///</summary>
    4 ///<remarks>
    5 /// This should be created immediately instead of lazyloaded. It'll reduce the number of null checks that occur
    6 /// due to heavy reliance on calls to BlogSettings.Instance.
    7 ///</remarks>
    8 private static readonly Dictionary<Guid, BlogSettings> blogSettingsSingleton = new Dictionary<Guid, BlogSettings>();
    9
    10 ///<summary>
    11 /// Gets the singleton instance of the <see cref = "BlogSettings" /> class.
    12 ///</summary>
    13 ///<value>A singleton instance of the <see cref = "BlogSettings" /> class.</value>
    14 ///<remarks>
    15 ///</remarks>
    16 public static BlogSettings Instance
    17 {
    18 get
    19 {
    20 return GetInstanceSettings(Blog.CurrentInstance);
    21 }
    22 }
    23
    24 ///<summary>
    25 /// Returns the settings for the requested blog instance.
    26 ///</summary>
    27 public static BlogSettings GetInstanceSettings(Blog blog)
    28 {
    29 BlogSettings blogSettings;
    30
    31 if (!blogSettingsSingleton.TryGetValue(blog.Id, out blogSettings))
    32 {
    33 lock (SyncRoot)
    34 {
    35 if (!blogSettingsSingleton.TryGetValue(blog.Id, out blogSettings))
    36 {
    37 // settings will be loaded in constructor.
    38 blogSettings = new BlogSettings();
    39
    40 blogSettingsSingleton[blog.Id] = blogSettings;
    41 }
    42 }
    43 }
    44
    45 return blogSettings;
    46 }

    用一个键、值对集合存储博客设置的单例集合,然后获取特定的博客设置的时候,根据当前博客实例(根据当前博客的ID返回Blog.CurrentInstance)

     1         ///<summary>
    2 /// Prevents a default instance of the <see cref = "BlogSettings" /> class from being created.
    3 /// Initializes a new instance of the <see cref = "BlogSettings" /> class.
    4 ///</summary>
    5 private BlogSettings()
    6 {
    7 this.Load();
    8 }
    9
    10 ///<summary>
    11 /// Initializes the singleton instance of the <see cref="BlogSettings"/> class.
    12 ///</summary>
    13 private void Load()
    14 {
    15
    16 // ------------------------------------------------------------
    17 // Enumerate through individual settings nodes
    18 // ------------------------------------------------------------
    19 var dic = BlogService.LoadSettings();
    20 var settingsProps = GetSettingsTypePropertyDict();
    21
    22 foreach (System.Collections.DictionaryEntry entry in dic)
    23 {
    24 string name = (string)entry.Key;
    25 System.Reflection.PropertyInfo property = null;
    26
    27 if (settingsProps.TryGetValue(name, out property))
    28 {
    29 // ------------------------------------------------------------
    30 // Attempt to apply configured setting
    31 // ------------------------------------------------------------
    32 try
    33 {
    34 if (property.CanWrite)
    35 {
    36 string value = (string)entry.Value;
    37 var propType = property.PropertyType;
    38
    39 if (propType.IsEnum)
    40 {
    41 property.SetValue(this, Enum.Parse(propType, value), null);
    42 }
    43 else
    44 {
    45 property.SetValue(this, Convert.ChangeType(value, propType, CultureInfo.CurrentCulture), null);
    46 }
    47 }
    48 }
    49 catch (Exception e)
    50 {
    51 Utils.Log(string.Format("Error loading blog settings: {0}", e.Message));
    52 }
    53 }
    54
    55 }
    56
    57 }

    上面的构造函数是私有的,我想应该是单例模式的需要吧。首先BlogService.LoadSettings();加载配置,然后赋值给当前实例的属性,至此初始化配置完毕。



  • 相关阅读:
    实现iFrame自适应高度,原来非常简单!
    ajax document.write 问题
    [转]JavaScript为事件处理器传递参数
    开源手机自动化测试框架iQuery入门教程(一)
    Visual Studio的Web Performance Test提取规则详解(1)
    .Net最佳实践3:使用性能计数器收集性能数据
    Visual Studio进行Web性能测试 Part III
    Visual Studio进行Web性能测试 Part II
    Visual Studio进行Web性能测试 Part I
    扩展iQuery使其支持多种编程语言(上) – 兼编译器的词法分析简介
  • 原文地址:https://www.cnblogs.com/whosedream/p/2258774.html
Copyright © 2020-2023  润新知