Enterprise Library Step By Step系列(二):配置应用程序块——进阶篇-阿里云开发者社区

开发者社区> 技术小甜> 正文

Enterprise Library Step By Step系列(二):配置应用程序块——进阶篇

简介:
+关注继续查看
在前一篇文章中,讲述了配置应用程序块的最简单的介绍,在本篇文章中我主要介绍一下配置应用程序块的响应配置变更通知,保护配置信息(加密配置信息),面向高级人员的扩展机制,配置数据的缓存等几个方面。在剖析篇中我会去分析配置应用程序块的底层设计及类设计。
一.响应配置变更通知:
Configuration Application Block提供了一个事件机制,当存储的配置变更时通知应用程序 ,使用步骤:
1)创建一个EverntHandler
 1ExpandedBlockStart.gif/// <summary>
 2InBlock.gif        /// 创建EventHanler
 3InBlock.gif        /// </summary>
 4InBlock.gif        /// <param name="sender"></param>
 5ExpandedBlockEnd.gif        /// <param name="args"></param>

 6None.gif        private void OnConfigurationChanged(object sender, ConfigurationChangedEventArgs args)
 7ExpandedBlockStart.gif        {
 8InBlock.gif            Cursor = System.Windows.Forms.Cursors.WaitCursor;
 9InBlock.gif
10InBlock.gif            EditorFontData configData = ConfigurationManager.GetConfiguration("EditorSettings"as EditorFontData;
11InBlock.gif
12InBlock.gif            StringBuilder results = new StringBuilder();            
13InBlock.gif            results.Append("Configuration changes in storage were detected. Updating configuration.");
14InBlock.gif            results.Append(Environment.NewLine);
15InBlock.gif            results.Append("New configuration settings:");
16InBlock.gif            results.Append(Environment.NewLine);
17InBlock.gif            results.Append('\t');
18InBlock.gif            results.Append(configData.ToString());
19InBlock.gif            results.Append(Environment.NewLine);
20InBlock.gif
21InBlock.gif            Cursor = System.Windows.Forms.Cursors.Arrow;      
22ExpandedBlockEnd.gif        }
2)注册事件
1ExpandedBlockStart.gif///注册事件
2None.gif        ConfigurationManager.ConfigurationChanged += new ConfigurationChangedEventHandler(OnConfigurationChanged); 
二.配置数据的缓存:
Configuration Application Block在设计时提供了对配置数据的缓存,在读取XML数据后,再次读取它首先会判断缓存是否为空,如果不为空,它会直接从缓存中读取数据(在剖析篇中会有详细的介绍)。
显式的清除掉缓存用下面这句代码即可:
1ExpandedBlockStart.gif///清除缓存数据
2None.gif         ConfigurationManager.ClearSingletonSectionCache();
三.面向高级人员的扩展机制:
1 除了用XML文件可以存储数据外,还可以创建自己的存储方式,像SQL Server Database,注册表存储等,这时就需要我们自己创建StorageProvider。创建自定义的Storage Provider,需要注意以下几点:
1)要读取和写入数据,需要继承于StorageProvider类和分别实现IStorageProviderReaderIstorageProviderWriter接口:
1None.gifpublic class XmlFileStorageProvider : StorageProvider, IStorageProviderWriter
2ExpandedBlockStart.gif        {
3InBlock.gif            //……
4ExpandedBlockEnd.gif        }
2)如果实现了IConfigurationProvider接口,则方法Initialize()就不能为空,也必须实现:
1None.gifpublic override void Initialize(ConfigurationView configurationView)
2ExpandedBlockStart.gif        {
3InBlock.gif            //……
4ExpandedBlockEnd.gif        }
3)实现Read()Write()方法,记住一定要返回类型为object,否则Transformer将无法使用:
1None.gifpublic override object Read()
2ExpandedBlockStart.gif        {
3InBlock.gif            //……
4ExpandedBlockEnd.gif        }

5None.gif
6None.gif        public void Write(object value)
7ExpandedBlockStart.gif        {
8InBlock.gif            //……
9ExpandedBlockEnd.gif        }
2.创建自定义的Transformer
如果我们创建的自定义的Storage Provider不能后支持XMLNode,这时候我们需要创建自己的Transformer,需要注意以下几点:
1)自定义的Transformer如果实现了Itransformer接口;则必须实现方法Serialize()Deserialize();
2)自定义的Transformer如果实现了IConfigurationProvider接口,则方法Initialize()就不能为空,也必须实现;
下面给出一个SoapSerializerTransformer的例子程序(先声名一下,这个例子程序不是我写的,而是Dario Fruk先生^_^):
 1None.gifnamespace idroot.Framework.Configuration
 2ExpandedBlockStart.gif{
 3InBlock.gif    using System;
 4InBlock.gif    using System.Configuration;
 5InBlock.gif    using System.IO;
 6InBlock.gif    using System.Runtime.Serialization.Formatters.Soap;
 7InBlock.gif    using System.Text;
 8InBlock.gif    using System.Xml;
 9InBlock.gif
10InBlock.gif    using Microsoft.Practices.EnterpriseLibrary.Common;
11InBlock.gif    using Microsoft.Practices.EnterpriseLibrary.Configuration;
12InBlock.gif
13ExpandedSubBlockStart.gif    /// <summary>
14InBlock.gif    /// SoapSerializerTransformer is a custom Serialization Transformer for Microsft Enterprise Library 1.0.
15ExpandedSubBlockEnd.gif    /// </summary>

16InBlock.gif    public class SoapSerializerTransformer : TransformerProvider
17ExpandedSubBlockStart.gif    
18InBlock.gif        public override void Initialize(ConfigurationView configurationView)
19ExpandedSubBlockStart.gif        {
20InBlock.gif            // Do nothing. This implementation does not require any additional configuration data because SoapFormatter reflects types 
21InBlock.gif            // during serialization.
22ExpandedSubBlockEnd.gif        }

23InBlock.gif
24InBlock.gif        public override object Serialize(object value)
25ExpandedSubBlockStart.gif        {
26InBlock.gif            SoapFormatter soapFormatter = new SoapFormatter();
27InBlock.gif            StringBuilder stringBuilder = new StringBuilder();
28InBlock.gif            XmlDocument doc = new XmlDocument();
29InBlock.gif
30InBlock.gif            stringBuilder.Append("<soapSerializerSection>");
31InBlock.gif
32InBlock.gif            string serializedObject = "";
33InBlock.gif            using (MemoryStream stream = new MemoryStream())
34ExpandedSubBlockStart.gif            {
35InBlock.gif                soapFormatter.Serialize(stream, value);
36InBlock.gif                byte[] buffer = stream.GetBuffer();
37InBlock.gif                // quick fix for 0-byte padding
38InBlock.gif                serializedObject = ASCIIEncoding.ASCII.GetString(buffer).Replace('\0'' ').Trim();
39ExpandedSubBlockEnd.gif            }

40InBlock.gif            stringBuilder.Append(serializedObject);
41InBlock.gif
42InBlock.gif            stringBuilder.Append("</soapSerializerSection>");
43InBlock.gif            doc.LoadXml(stringBuilder.ToString());
44InBlock.gif
45InBlock.gif            return doc.DocumentElement;
46ExpandedSubBlockEnd.gif        }

47InBlock.gif
48InBlock.gif        public override object Deserialize(object section)
49ExpandedSubBlockStart.gif        {
50InBlock.gif            ArgumentValidation.CheckForNullReference(section, "section");
51InBlock.gif            ArgumentValidation.CheckExpectedType(section, typeof(XmlNode));
52InBlock.gif
53InBlock.gif            XmlNode sectionNode = (XmlNode)section;
54InBlock.gif
55InBlock.gif            XmlNode serializedObjectNode = sectionNode.SelectSingleNode("//soapSerializerSection");
56InBlock.gif            if (serializedObjectNode == null)
57ExpandedSubBlockStart.gif            {
58InBlock.gif                throw new ConfigurationException("The required element '<soapSerializationSection>' missing in the specified Xml configuration file.");
59ExpandedSubBlockEnd.gif            }

60InBlock.gif
61InBlock.gif            SoapFormatter soapFormatter = new SoapFormatter();
62InBlock.gif            try
63ExpandedSubBlockStart.gif            {
64InBlock.gif                object obj = null;
65InBlock.gif                using (MemoryStream stream = new MemoryStream())
66ExpandedSubBlockStart.gif                {
67InBlock.gif                    using (StreamWriter sw = new StreamWriter(stream, Encoding.ASCII))
68ExpandedSubBlockStart.gif                    {
69InBlock.gif                        sw.Write(serializedObjectNode.InnerXml);
70InBlock.gif                        sw.Flush();
71InBlock.gif                        // rewind stream to the begining or deserialization will throw Exception.
72InBlock.gif                        sw.BaseStream.Seek(0, SeekOrigin.Begin); 
73InBlock.gif                        obj = soapFormatter.Deserialize(stream);
74ExpandedSubBlockEnd.gif                    }

75ExpandedSubBlockEnd.gif                }

76InBlock.gif                return obj;
77ExpandedSubBlockEnd.gif            }

78InBlock.gif            catch (InvalidOperationException e)
79ExpandedSubBlockStart.gif            {
80InBlock.gif                string message = e.Message;
81InBlock.gif                if (null != e.InnerException)
82ExpandedSubBlockStart.gif                {
83InBlock.gif                    message = String.Concat(message, " ", e.InnerException.Message);
84ExpandedSubBlockEnd.gif                }

85InBlock.gif                throw new ConfigurationException(message, e);
86ExpandedSubBlockEnd.gif            }

87ExpandedSubBlockEnd.gif        }

88ExpandedSubBlockEnd.gif    }

89ExpandedBlockEnd.gif}
 
3.使用其它的Providers
       SQL Server Provider:使用数据库SQL Server Provider
       Registry Provider:使用注册表Provider
四.保护配置信息:
配置信息直接放在了XML文件里面是不安全,我们可以用加密应用程序块对其进行加密,其实对于所有的应用程序块的配置信息都可以进行加密,我们到加密应用程序块时再详细讨论:)
进阶篇就写到这里了,后面继续剖析篇,在剖析篇里我会从配置应用程序块的底层设计,到类设计等作一些介绍(个人理解^_^





















本文转自lihuijun51CTO博客,原文链接: http://blog.51cto.com/terrylee/67600,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
计算机基础2 | 学习笔记
快速学习计算机基础2。
10 0
计算机基础1 | 学习笔记
快速学习计算机基础1。
7 0
ECS体验
有买一台服务器的想法,但是只是做小测试和共享用,并不要求太长时间和太高配置,于是,价钱便是一个问题,作为一个在校学生,钱,是第一难题。
10 0
数据类型-数值和字符串 | 学习笔记
快速学习数据类型-数值和字符串。
5 0
Linux 命令执行过程 | 学习笔记
快速学习 Linux 命令执行过程。
7 0
PG+MySQL第9课-实时精准营销
通常业务场景会涉及基于标签条件圈选目标客户、基于用户特征值扩选相似人群、群体用户画像分析这些技术,本文将围绕这三个场景去介绍在实施精准营销里面的PG数据库的使用
7 0
Java classloader详解
Java程序并不是一个可执行文件,而是由很多的Java类组成,其运行是由JVM来控制的。而JVM从内存中查找到类,而真正将类加载进内存的就是ClassLoader,可以说我们每天都在接触ClassLoader,但是很多时候我们没有明白其执行的流程和原理。
5 0
冬季实战营第一期学习报告
通过五天学习与实操,对ECS云服务器入门、快速搭建LAMP环境、部署MySQL数据库、回顾搭建Docker环境和Spring Boot以及使用PolarDB和ECS搭建门户网站操作,对本期学习与实操的认识。
7 0
Redis高可用架构演进
Redis是目前使用最广泛的缓存程序之一,也被应用于多种场景,例如数据缓存、分布式锁等,Redis官方提供了多种部署架构,以满足不同应用场景下对于高可用和扩展性的要求。
6 0
MySQL高可用架构演进
MySQL是数据库领域当之无愧的霸主之一,其在各行各业被广泛应用,随着广泛使用,对于MySQL本身的高可用性的要求就是不可避免的话题,而MySQL的高可用方案也随着MySQL功能的完善经历了多次升级,本文将对MySQL的各种高可用架构进行分析,以此来了解架构的演进。
8 0
+关注
10146
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载