惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - 黑武士

此处已被废弃 悲惨的开发工程师人生之路(转载) 中国企业为什么不需要软件 试析J2EE与.NET时代的商业利润 J2EE还是.NET,这是一个问题 三十岁:程序员的职业发展 程序员:迫在眉睫的职业规划 新手宝典 J2EE专家起步图解(转载) 谁为企业信息化损失买单? 非专业程序员谈程序员修炼之路 搭建系统框架发现的三个Web.Config问题 在ASP.Net中应用Javascript 星球大战:一场与我无关的童话 中国软件---技术篇 软件项目的“管理之痒” Petshop项目的数据库 正则表达式 用C#实现的数据库抽象工厂 C#编码标准--编码习惯
几个开源项目配置信息的存储和处理的方式
黑武士 · 2005-06-21 · via 博客园 - 黑武士

最近在看duwamish7,asp.net forums, dottext几个优秀的开源(微软官方)的项目
因我目前所处的技术水平的阶段的原因,我看这些项目程序,更加关注的是具体的实现
次之才是架构

这次的关注点是它们存储和处理配置信息的不同方式

一,duwamish7和asp.net forums
这两者处理方式有相同之处,都是通过实现IConfigurationSectionHandler来实现配置类
配置类的代码如下:

    public class DuwamishConfiguration : IConfigurationSectionHandler
    
{
        
private static string
 dbConnectionString  ;
        
private static bool
 enablePageCache ;IConfigurationSectionHandler 成员

        
public static string ConnectionString
        
{
            
get return dbConnectionString ; }

        }


        
public static bool EnablePageCache
        
{
            
get return enablePageCache ; }

        }

    }

web.config如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
     
<section name="DuwamishConfiguration" type="Duwamish7.Common.DuwamishConfiguration, Duwamish7.Common"  />
  
</configSections>
  
<DuwamishConfiguration>
     
<add key="dbConnectionString" value="server=localhost;User ID=Duwamish7;Password=password;database=Duwamish7;Connection Reset=FALSE" />
     
<add key="enablePageCache" value="true" />
  
</DuwamishConfiguration>
  
<system.web> 
  
<compilation debug="true" />

 
</system.web>
</configuration>

然后就可以DuwamishConfiguration.ConnectionString获得数据库连接,DuwamishConfiguration.xxxx获得你定义的其他
数据了,不过这样用之前,需要先调用这个方法哦
System.Configuration.ConfigurationSettings.GetConfig("DuwamishConfiguration") ;
通常这个方法会放在Global.asa的application_start事件处理中,或者自己定义的
httpmodule的application_start类似事件中

二,dottext配置信息的存储和处理
dottext配置信息不是放在web.config,而是放在一个自己定义的blog.config文件中:

<?xml version="1.0" encoding="utf-8" ?> 
<BlogConfigurationSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  
<ConnectionString>Data Source=KWK;Database=blog;UID=sa;Pwd=sa;</ConnectionString>
  
<EnablePageCache>true</EnablePageCache>
</BlogConfigurationSettings>

然后通过串行化的方式获取数据,先定义对应的类:

[Serializable]
public class
 BlogConfigurationSettings
{
   
private string
 _connectionString ;
   
public string
 ConnectionString
   
{
       
get return _connectionString ; }

       
set { _connectionString = value ; }
   }

   
   
private bool _enablePageCache ;
   
public bool
 EnablePageCache
   
{
       
get return _enablePageCache ; }

       
set { _enablePageCache = value ; }
   }

}

然后可以通过如下方法获得这些配置类对象:

                public static BlogConfigurationSettings Instance(HttpContext context)
        
{
                      
//在实际的应用中,别忘了加上缓存

              string filepath = context.Server.MapPath("~/blog.config");
              settings 
= (BlogConfigurationSettings)LoadSerializedObject(typeof
(BookConfigurationSettings),filepath);
              
return
 settings;
        }

        
public static object LoadSerializedObject(Type type, string filename)
        
{
            FileStream fs 
= null
;
            
try

            
{
                
// open the stream

                fs = new FileStream(filename, FileMode.Open,FileAccess.Read);
                XmlSerializer serializer 
= new
 XmlSerializer(type);
                
return
 serializer.Deserialize(fs);
            }

            
catch(Exception e)
            
{
                
throw
 e;
            }

            
finally
            
{
                
if(fs != null
)
                    fs.Close();
            }

        }

至于孰优孰劣,那就看具体的应用了,这个是见人见智的问题了