BlogEngine.NET (一)配置

来源:互联网 发布:amazon是什么软件 编辑:程序博客网 时间:2024/05/22 08:20

因为日志的配置信息比较多,而且可能每个人的配置都不相同,所以BlogEngine.NET中的 配置信息需要统一管理,日志结构图如下:

BlogBasePage类是个抽象类,是其他web页面的基类,它会使用BlogSettings获得配置信息,代码如下:

public abstract class BlogBasePage : System.Web.UI.Page
  
{

    
private string _Theme = BlogSettings.Instance.Theme;
    
/// <summary>
    
/// Assignes the selected theme to the pages.
    
/// </summary>

    protected override void OnPreInit(EventArgs e)
    
{
      
if (Request.QueryString["theme"!= null)
        _Theme 
= Request.QueryString["theme"];

      MasterPageFile 
= "~/themes/" + _Theme + "/site.master";

      
base.OnPreInit(e);

      
if (!Page.IsPostBack && !string.IsNullOrEmpty(Request.QueryString["deletepost"]))
      
{
        
if (Page.User.Identity.IsAuthenticated)
        
{
          Post post 
= BlogEngine.Core.Post.GetPost(new Guid(Request.QueryString["deletepost"]));
          post.Delete();
          post.Save();
          Response.Redirect(
"~/");
        }

      }

    }

}

BlogSettings中使用单件模式:

 public static BlogSettings Instance
    
{
      
get
      
{
        
if (blogSettingsSingleton == null)
        
{
          blogSettingsSingleton 
= new BlogSettings();
        }

        
return blogSettingsSingleton;
      }

    }

在BlogSettings的私有构造函数中调用了 Load();方法,这个方法使用BlogService类获得配置信息,使用反射技术给BlogSettings实例对象中的属性赋值

 private void Load()
    
{
      Type settingsType 
= this.GetType();

      
//------------------------------------------------------------
      
//    Enumerate through individual settings nodes
      
//------------------------------------------------------------
      System.Collections.Specialized.StringDictionary dic = Providers.BlogService.LoadSettings();
      
foreach (string key in dic.Keys)
      
{
        
//------------------------------------------------------------
        
//    Extract the setting's name/value pair
        
//------------------------------------------------------------
        string name = key;
        
string value = dic[key];

        
//------------------------------------------------------------
        
//    Enumerate through public properties of this instance
        
//------------------------------------------------------------
        foreach (PropertyInfo propertyInformation in settingsType.GetProperties())
        
{
          
//------------------------------------------------------------
          
//    Determine if configured setting matches current setting based on name
          
//------------------------------------------------------------
          if (propertyInformation.Name.Equals(name, StringComparison.OrdinalIgnoreCase))
          
{
            
//------------------------------------------------------------
            
//    Attempt to apply configured setting
            
//------------------------------------------------------------
            try
            
{
              propertyInformation.SetValue(
this, Convert.ChangeType(value, propertyInformation.PropertyType, CultureInfo.CurrentCulture), null);
            }

            
catch
            
{
              
// TODO: Log exception to a common logging framework?
            }

            
break;
          }

        }

      }

    }

BlogService通过读取webconfig中的section同时利用反射技术获得provider的具体类

private static void LoadProviders()
        
{
            
// Avoid claiming lock if providers are already loaded
            if (_provider == null)
            
{
                
lock (_lock)
                
{
                    
// Do this again to make sure _provider is still null
                    if (_provider == null)
                    
{
                        
// Get a reference to the <blogProvider> section
                        BlogProviderSection section = (BlogProviderSection)WebConfigurationManager.GetSection("BlogEngine/blogProvider");

                        
// Load registered providers and point _provider
                        
// to the default provider
                        _providers = new BlogProviderCollection();
                        ProvidersHelper.InstantiateProviders(section.Providers, _providers, 
typeof(BlogProvider));
                        _provider 
= _providers[section.DefaultProvider];

                        
if (_provider == null)
                            
throw new ProviderException("Unable to load default BlogProvider");
                    }

                }

            }

        }

webconfig中的相关信息为

<configSections>
    
<sectionGroup name="BlogEngine">
      
<section name="blogProvider" requirePermission="false" type="BlogEngine.Core.Providers.BlogProviderSection, BlogEngine.Core" allowDefinition="MachineToApplication" restartOnExternalChanges="true"/>
    
</sectionGroup>
  
</configSections>

  
<BlogEngine>
    
<blogProvider defaultProvider="XmlBlogProvider">
      
<providers>
        
<add name="XmlBlogProvider" type="BlogEngine.Core.Providers.XmlBlogProvider"/>
        
<add name="MSSQLBlogProvider" type="BlogEngine.Core.Providers.MSSQLBlogProvider"/>
      
</providers>
    
</blogProvider>
  
</BlogEngine>
原创粉丝点击