Enterprise Library Step By Step系列(一):配置应用程序块——入门篇

写在前面:

最近准备写Enterprise Library Step By Step的系列文章,对于每一个应用程序块,我都会用入门篇,进阶篇,剖析篇三篇文章去写。 在入门篇里会详细介绍应用程序块的使用步骤,主要是针对新手入门的;进阶篇会介绍一些应用程序块的更深的应用及扩展机制;剖析篇会去分析应用程序块的底层设计和类设计的一些内容。所有的观点都纯属个人理解,有不当之处请大家多多指教。

一.配置应用程序块概述:

      几乎每一个应用程序都需要一些配置信息,这些信息可以是简单的数据库连接信息,或者复杂的多块多层次用户信息。如何以及在哪里存储应用程序配置数据是程序员经常面临的问题。

.为应用系统提供了一个通用的配置管理解决方案,可方便灵活地从各种存储中读写配置信息配置信息

.为读写配置信息提供了简单的接口

.支持不同的配置存储

.支持配置信息的加密

.支持配置文件的动态更新

.支持复杂的配置对象

Config Config Block Block 的使用场景:

.应用系统需要在运行时读写复杂的配置信息

.应用系统需要在配置文件中保存敏感数据(比如密码)

.设计应用系统时能帮助开发人员进行正确的配置读写

.应用系统部署后系统管理员能有一个好的工具修改XM 配置文件

二.使用步骤:

假设已经新建好的项目中,并且已经存在Web.configApp.config配置文件。

第一步:建立自定义配置数据类:

该类根据项目的实际情况建立,需要注意的是该类必须是可序列化的(XMLSerializer),并且可以任意复杂

 1using System;
 2using System.Text;
 3using System.Xml.Serialization;
 4
 5namespace ConfigurationQuickStart
 6{
 7    public class EditorFontData
 8    {        
 9        private string  name;
10        private float   size;
11        private int        style;
12
13        public EditorFontData()
14        {          
15        }

16
17        public string Name 
18        {
19            getreturn name; }
20            set{ name = value; }
21        }
 
22        
23        public float Size 
24        {
25            getreturn size; }
26            set{ size = value; }
27        }
 
28        public int Style 
29        {
30            getreturn style; }
31            set{ style = value; }
32        }
 
33
34        public override string ToString() 
35        {
36            StringBuilder sb = new StringBuilder();
37            sb.AppendFormat("Name = {0}; Size = {1}; Style = {2}", name, size.ToString(), style.ToString());
38
39            return sb.ToString();
40        }

41    }

42}

43

第二步:用Enterprise Library Configuration配置应用程序:

1.运行Enterprise Library Configuration 工具选择File | Open Application 打开App.config文件

2.右击Application并选择New | Configuration Application Block创建一个配置应用程序块

3.右击 Configuration Application Block 并选择 New | Configuration Section创建一个配置区,注意对于每一个配置区都要设置一个Storage Provider 和一个Transformer

4.重命名configuration sectionEditorSettings

5.右击EditorSettings 并选择New | XML File Storage Provider,设置它的Storage Provider

6.在FileName输入框中输入EditorSettings.config,路径相对于App.config


7
.在Enterprise Library Configuration 工具里面选择New | XML Serializer Transformer。指定它的Transformer

8选择File | Save All命令保存全部

9.此时在VS中选择项目|显示所有文件,就会发现在项目中多出了一个名为EditorSettings.config的配置文件

10.在项目中选择 属性|生成事件|生成后事件命令行 输入如下内容:

1copy "$(ProjectDir)\*.config" "$(TargetDir)"

第三步:用代码访问配置数据:

1.在项目中添加如下两个引用

    • Microsoft.Practices.EnterpriseLibrary.Common.dll,
    • Microsoft.Practices.EnterpriseLibrary.Configuration.dll.

2.并在.CS代码中添加:

1using Microsoft.Practices.EnterpriseLibrary.Configuration;

3.写配置信息:注意在写配置信息时是整个配置区被覆盖(无合并),另外,元配置文件必须包含该配置区的定义。

 1/// <summary>
 2        /// 写XML
 3        /// </summary>

 4        private void writeXmlConfigDataButton_Click(object sender, EventArgs e)
 5        {
 6            EditorFontData configData = new EditorFontData();
 7
 8            if (fontDialog.ShowDialog() == DialogResult.OK)
 9            {
10                configData.Name = fontDialog.Font.Name;
11                configData.Size = fontDialog.Font.Size;
12                configData.Style = Convert.ToInt32(fontDialog.Font.Style);
13                
14                ///注意WriteConfiguration 方法,有两个参数:
15                ///第一个是配置节名称
16                ///第二个就是自定义配置类的对象
17                ///实际上就是将配置数据写到这个配置节里去了
18                ///程序对此的处理是透明的

19                ConfigurationManager.WriteConfiguration("EditorSettings", configData);
20
21                StringBuilder results = new StringBuilder();
22                results.Append("Configuration Data Updated:");
23                results.Append(Environment.NewLine);
24                results.Append('\t');
25                results.Append(configData.ToString());
26
27            }

28

4.读配置信息:

 1/// <summary>
 2        /// 读XML
 3        /// </summary>

 4        private void readXmlConfigDataButton_Click(object sender, System.EventArgs e)
 5        {
 6            Cursor = System.Windows.Forms.Cursors.WaitCursor;
 7            
 8            ///GetConfiguration方法就一个参数,即配置节名称
 9            ///注意别忘了进行强制类型转换

10            EditorFontData configData = ConfigurationManager.GetConfiguration("EditorSettings"as EditorFontData;
11
12            StringBuilder results = new StringBuilder();            
13            results.Append("Configuration settings:");
14            results.Append(Environment.NewLine);
15            results.Append('\t');
16            results.Append(configData.ToString());
17            results.Append(Environment.NewLine);
18
19            Cursor = System.Windows.Forms.Cursors.Arrow;
20        }

入门篇就到这里了,下面我会尽快写配置应用程序块的进阶篇及剖析篇的:)
作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2005-10-14 10:51 TerryLee 阅读(24912) 评论(86)  编辑 收藏 所属分类: Enterprise Library

  回复  引用    
#1楼 2005-10-14 11:46 | Martin Yan [未注册用户]
比较不错的入门介绍,希望能继续看到后续的文章
  回复  引用    
#2楼 2005-10-14 12:36 | 雷波 [未注册用户]
不错,继续期待.
  回复  引用  查看    
#3楼 2005-10-14 16:48 | Sadly_Lee      
10.在项目中选择 属性|生成事件|生成后事件命令行 输入如下内容:

1copy "$(ProjectDir)\*.config" "$(TargetDir)"

這個地方asp.net項目怎么設置啊
  回复  引用  查看    
#4楼 2005-10-14 19:09 | Terrylee      
To:Martin Yan,雷波

多谢支持,我会尽快写的:)
  回复  引用  查看    
#5楼 2005-10-14 19:10 | Terrylee      
To:Sadly_Lee

在ASP.NET中不用设置,只要相对于Web.config的相对路径就可以了
  回复  引用    
#6楼 2005-10-14 23:12 | wyn [未注册用户]
很好,一直想看关于Enterprise library的文章!
  回复  引用    
#7楼 2005-10-15 09:40 | Simon [未注册用户]
非常不错。
  回复  引用    
#8楼 2005-11-02 14:33 | jeffers [未注册用户]
EditorSettings.config在没有使用ConfigurationManager.WriteConfiguration写入之前是空的?还是有基本的schema,只是没有value。
我的程序总是出错!
  回复  引用  查看    
#9楼 [楼主]2005-11-02 15:19 | Terrylee      
@wyn
@Simon
多谢支持:)

  回复  引用  查看    
#10楼 [楼主]2005-11-02 15:20 | Terrylee      
@jeffers
EditorSettings.config是空的,不需要自动手动填写,完全由配置管理工具写入:)
  回复  引用  查看    
#11楼 2005-11-02 19:58 | Aaronzhu      
@Terrylee
"EditorSettings.config是空的,不需要自动手动填写,完全由配置管理工具写入:)"
好像不是这样的。
因为EditorSettings.config文件中的内容是由ConfigurationManage将EditorFontData序列化后写入的,不是由配置管理工具写入的。因此如果没有没有执行ConfigurationManager.WriteConfiguration则EditorSettings.config应该是空的。
而,在web程序中,代码里不可能执行对config文件的写操作的,因此在web程序中,应该怎么生成EditorSettings.config文件的内容?
我想这才是jeffers的问题。是这样嘛?

  回复  引用    
#12楼 2005-11-03 11:05 | BrianXue [未注册用户]
看到这里我还是不太明白Enterprise Library 的具体作用是什么,
但是谢谢。
  回复  引用  查看    
#13楼 [楼主]2005-11-03 12:21 | Terrylee      
@BrianXue
Enterprise Library是微软提供的一系列的应用程序块,包括配置,数据访问,安全,日志,缓存,加密等。这些程序块你可以直接在项目中应用,而且这些程序块是有源码的,也可以自行扩展。本篇配置应用程序块是后面所有的应用程序块的基础,Enterprise Library 是以配置驱动的。

乱说了一通,不知道对你有没有帮助?:)

  回复  引用  查看    
#14楼 [楼主]2005-11-03 12:25 | Terrylee      
@Aaronzhu
你说得对,是我看错了。最近有点晕了^_^
在Web中写入.config文件我还真没尝试过……

非常感谢您的提醒!
  回复  引用    
#15楼 2005-11-10 13:53 | bendise [未注册用户]
Enterprise Library 在那里运行,我找不到
  回复  引用  查看    
#16楼 [楼主]2005-11-10 14:12 | Terrylee      
@bendise
我不太明白你说的是……

Enterprise Library下载安装后在开始菜单里面有一项

在你的程序中应用时,需要添加相应的DLL,默认的目录为:
C:\Program Files\Microsoft Enterprise Library\bin


  回复  引用    
#17楼 2005-11-17 09:50 | bendise [未注册用户]
在项目中选择 属性|生成事件|生成后事件命令行 输入如下内容

到这步我不会作了,属性|生成事件 ,在那里?? 能给张截图吗,谢谢
  回复  引用  查看    
#18楼 [楼主]2005-11-17 11:53 | Terrylee      
@bendise

请参见我今天Post的一篇《使用.NET Remoting开发分布式应用——配置文件篇》
随笔

这篇随笔里面也用到了这步操作

我在里面加了图片:)
  回复  引用  查看    
#19楼 2005-11-24 15:38 | 西门吹雪      
好文章,一直希望找这样的文章现在终于找到。谢谢同时支持terrylee继续发布相关的文章。
  回复  引用  查看    
#20楼 [楼主]2005-11-24 15:50 | Terrylee      
@西门吹雪

多谢支持,最近项目比较紧,所以停了几天。我会尽快发布其他的……
  回复  引用  查看    
#21楼 2005-11-24 17:30 | 西门吹雪      
@Aaronzhu
在web程序中,代码里不可能执行对config文件的 "写" 操作的,.... ??

只要是ASPNET的帐户拥有对Config文件的写权限不就可以写Config文件了吗?只不过看写进去的是什么文件了,如果写到web.config文件里面当前的Session就会丢失.
web程序就会重启。顺便请教@Terrylee 在web项目中Enterprise Library能否把配置的一些信息写到自定义的配置文件里面.
  回复  引用  查看    
#22楼 2005-11-29 16:18 | 栖息的熊      
@在项目中选择 属性|生成事件|生成后事件命令行 输入如下内容

我是这样写的
copy "sourceDir\*.config" "tarDIr"
编译成功了
不知道$是做什么用的
但我发现sourceDir下的config改变之后,tarDir下的没变

  回复  引用  查看    
#23楼 2005-11-29 16:18 | 栖息的熊      
@在项目中选择 属性|生成事件|生成后事件命令行 输入如下内容

我是这样写的
copy "sourceDir\*.config" "tarDIr"
编译成功了
不知道$是做什么用的
但我发现sourceDir下的config改变之后,tarDir下的没变

  回复  引用  查看    
#24楼 [楼主]2005-11-29 16:23 | Terrylee      
@栖息的熊

生成后事件命令行应该这样写:

copy "$(ProjectDir)\*.config" "$(TargetDir)"

这个是固定的语法,请参考宏的知识

不要手工修改成copy "sourceDir\*.config" "tarDIr"

该命令是在生成后事件命令,编译是不会报错的,只不过生成没有执行而已
  回复  引用  查看    
#25楼 2005-11-30 10:50 | 栖息的熊      
不知道参考宏的什么方面的知识,msdn上看了一会,不太明白。
  回复  引用  查看    
#26楼 [楼主]2005-11-30 11:19 | Terrylee      
@栖息的熊

可以专门找本这方面的书或者google一下啊^_^

其实在这方面没必要花太多的时间

在企业库里面,用到的就这一个

记住就行了。
  回复  引用    
#27楼 2005-12-28 17:12 | 蓝海泛舟 [未注册用户]
to 西门吹雪
做过试验了。在asp.net项目中是不能使用作者的方法写入EditorSettings.config的。即使将iis的默认执行用户设置为administrator也不能修改。
所以只能手写,或写一个桌面配置工具写入配置文件。

  回复  引用    
#28楼 2005-12-28 17:18 | error [未注册用户]
为什么我在生成后事件那里定义了“copy "$(ProjectDir)\*.config" "$(TargetDir)" ”,编译就老是报告“生成后事件出错”?
  回复  引用    
#29楼 2005-12-28 17:20 | error [未注册用户]
这个语法应该没有问题吧?怎么执行不成功呢?copy 就是dos那个命令吧?是有什么限制?
  回复  引用    
#30楼 2005-12-29 10:37 | VLER [未注册用户]
我下载了Enterprise Library的Web Cast,很多细节讲解的比较笼统.呵呵.然后上网一搜就找到你这来了.谢谢你将学习心得拿出来分享.以后长来你这里学习了.呵呵.元旦快乐
  回复  引用  查看    
#31楼 [楼主]2005-12-30 08:25 | Terrylee      
@VLER

欢迎有空来坐坐:)

  回复  引用    
#32楼 2006-01-17 00:01 | vivid [未注册用户]
如果在ASP.NET程序中的 EditorSettings.config文件中手动添加内容,然后测试

ReadXML的功能,具体怎么添加啊?

我添加了好像不可以哦,谢谢啦^_^。
  回复  引用  查看    
#33楼 [楼主]2006-01-17 17:20 | Terrylee      
@vivid

如下所示:
 
<?xml version="1.0" encoding="utf-8"?>
<EditorSettings>
  
<xmlSerializerSection type="ConfigurationQuickStart.EditorFontData, ConfigurationRuntimeData, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    
<EditorFontData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      
<Name>宋体</Name>
      
<Size>21.75</Size>
      
<Style>1</Style>
    
</EditorFontData>
  
</xmlSerializerSection>
</EditorSettings>

  回复  引用  查看    
#34楼 2006-02-07 13:48 | 程序生活      
急问:Enterprise Library和offline application block有什么区别呀?
  回复  引用  查看    
#35楼 [楼主]2006-02-15 08:25 | Terrylee      
@程序生活
Application Block最早有11个组成,在Enterprise Library中只选取了其中的7个。
Offline application block不包括在EL中

楼主讲得很好..
辛苦了。

期待楼主把 "剖析篇" 写出来。

msdn上对 Enterprise Library 基础部分的也讲得不少,

对大家而言,分析里面的代码是非常有意义的!

  回复  引用  查看    
#37楼 [楼主]2006-03-03 16:46 | Terrylee      
@好好好好好好好好好好好好好好好
剖析篇只写了配置应用程序块,现在已经停止了
我打算在设计模式系列中体现……

另外,想研究一下Enterprise Library 2.0...

楼主回得好K快...

偶才看完第一部分...

现在我们公司新写的ERP已用上了 Enterprise Library ,

还有用 SharpDevelop 作为winform 框架...

真期待楼主设计模式系列的讲解!




  回复  引用  查看    
#39楼 [楼主]2006-03-03 17:38 | Terrylee      
@@好好好好好好好好好好好好好好好
探索设计模式系列已经开始写了,总共有30篇吧,目前写了10篇左右,进度比较慢,请参见:
http://terrylee.cnblogs.com/archive/2006/02/21/334911.html
  回复  引用    
#40楼 2006-03-15 10:27 | jedliu [未注册用户]
能否告诉我 属性|生成事件|生成后事件命令行 这个在哪里,我看了你写的《使用.NET Remoting开发分布式应用——配置文件篇》 还是找不到,你用的是2005还是2003?

  回复  引用  查看    
#41楼 [楼主]2006-03-15 12:46 | Terrylee      
@jedliu
在解决方案窗口中,项目上点击右键,可以找到~~~~

这些都是针对VS2003的
  回复  引用    
#42楼 2006-03-16 10:31 | jedliu [未注册用户]
谢谢Terry!
可我还是无法在web里找到!
我知道在winform里有,但web里没,是不是只是对win的?!
我刚接触这些,懂得太少,期待赐教!
  回复  引用  查看    
#43楼 [楼主]2006-03-16 11:42 | Terrylee      
@jedliu
Web下面不用做这一步
  回复  引用    
#44楼 2006-04-17 10:36 | lyceum luo [未注册用户]
现在Enterprise Library 已经发布2.0版本了。和楼主讲的这个版本有很大不同。楼主能不能在有时间的时候。把Enterprise Library 2.0 和1.0作一个比较。原来在1.0下的设置。现在在2.0下应该怎么设置。期待楼主的文章能早点发布。热烈期望中。。。。。。。
  回复  引用    
#45楼 2006-06-05 22:45 | hstang [未注册用户]
能告知把配置写入SQL SERVER怎么配吗?在Enterprise Library configuration 中怎么配生也不能成功的把配置数据写入数据库
  回复  引用  查看    
#46楼 [楼主]2006-06-06 08:27 |