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

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

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

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

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

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

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

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

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

75                }

76                return obj;
77            }

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

85                throw new ConfigurationException(message, e);
86            }

87        }

88    }

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





















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


相关文章
|
存储 计算机视觉 开发者
【mobileSam】使用大模型推理赋能标注工作,让标注工作不再困难
【mobileSam】使用大模型推理赋能标注工作,让标注工作不再困难
899 1
|
前端开发 计算机视觉 Python
浅蓝色代表什么颜色?——Python中的颜色表示与处理
本文介绍了浅蓝色在计算机图形和Web开发中的表示方法,包括RGB、十六进制和HSL三种常见格式,并详细说明了如何使用Python的Pillow和colorsys库来处理和转换这种颜色,最后给出了生成浅蓝色背景的CSS代码示例。
1052 6
|
机器学习/深度学习 数据采集 人工智能
智能化运维:AI在IT运维中的应用与挑战###
本文探讨了人工智能(AI)技术在IT运维领域的应用现状、具体实现方式及其面临的挑战。通过分析AI如何优化故障预测、自动化处理和资源管理,文章旨在揭示AI赋能下运维工作的变革潜力与实践难题,为读者提供对智能化运维趋势的深刻理解。 ###
|
缓存 网络协议 Linux
Linux ip命令常用操作
Linux的 `ip`命令是一个强大且灵活的网络管理工具,能够执行从基本的网络接口配置到高级的路由和VLAN管理等多种操作。通过熟练掌握这些常用操作,用户可以更加高效地管理和配置Linux系统的网络环境。无论是在日常管理还是故障排除中,`ip`命令都是必不可少的工具。
260 2
|
传感器 网络协议 网络架构
计算机网络基础教程:拓扑
【4月更文挑战第5天】
1645 9
 计算机网络基础教程:拓扑
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
存储 设计模式 分布式计算
面向对象编程在大数据处理中的最佳实践
【8月更文第12天】随着互联网和物联网技术的发展,数据量呈指数级增长,大数据处理已成为现代企业不可或缺的一部分。大数据处理通常涉及收集、存储、管理和分析海量数据集。传统的数据库管理系统难以应对这样的挑战,因此出现了诸如Hadoop、Spark等分布式处理框架。这些框架通常使用面向对象编程(OOP)来构建可扩展、可维护的应用程序。本文将探讨如何利用面向对象编程的原则和模式来优化大数据处理任务。
299 0
|
Python
VsCode集成Python开发环境
VsCode 环境下构建 Python 开发环境
512 0
VsCode集成Python开发环境
|
负载均衡 监控 Dubbo
Dubbo——初识RPC、Dubbo框架、使用直连方式实现Dubbo
Dubbo——初识RPC、Dubbo框架、使用直连方式实现Dubbo
Dubbo——初识RPC、Dubbo框架、使用直连方式实现Dubbo
|
消息中间件 移动开发 NoSQL
一套完善的H5商城开源了,绝无套路
waynboot-mall 是一套全部开源的微商城,包含三个项目:运营后台、H5 商城和后端接口。实现了一套完整的商城业务,有首页展示、商品分类、商品详情、sku 详情、商品搜索、加入购物车、结算下单、商品评论等一系列功能。商城前后台项目源码全部开源,绝无套路。技术上基于最新得 Springboot3.1,整合了 Redis、RabbitMQ、ElasticSearch 等常用中间件,根据博主多年线上项目实战经验总结开发而来不断优化、完善。
594 2