面向服务架构~全局配置文件也面向服务了

简介:

在面向服务中讲配置文件,肯定是要把它与具体领域分离,即它有普遍的一般性。在程序开发过程中,难免会用到一些易变性,全局的常量信息,我们通常的作法是把它们放在Web.config或者自定义的文件中,当然你的配置文件可以是XML,二进制的等等,但一般时候我们选择用XML标准的文件。

看全局配置项目的结构如下:

下面我来介绍一下每个文件的使用:

ConfigFactory它是一个配置文件的工厂类,作用当然就是“从配置文件中生产对象”了,呵呵。(这讲不考虑性能问题)

 1   /// <summary>
 2     /// 配置信息生产工厂
 3     /// </summary>
 4     public class ConfigFactory
 5     {
 6         #region 私有
 7 
 8         /// <summary>
 9         /// 配置文件管理类
10         /// </summary>
11         static ConfigFilesManager cfm;
12 
13         #endregion
14 
15         #region 公开的属性
16         public T GetConfig<T>() where T : IConfiger
17         {
18             string configFilePath = string.Empty;
19             string filename = typeof(T).Name;
20 
21             HttpContext context = HttpContext.Current;
22             string siteVirtrualPath = string.IsNullOrEmpty(ConfigurationManager.AppSettings["SiteVirtrualPath"]) ?
23                 "/" : ConfigurationManager.AppSettings["SiteVirtrualPath"];
24             if (context != null)
25             {
26                 configFilePath = context.Server.MapPath(string.Format("{0}/Configs/{1}.Config", siteVirtrualPath, filename));
27             }
28             else
29             {
30                 configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Configs\{0}.Config", filename);
31             }
32 
33             if (!File.Exists(configFilePath))
34             {
35                 throw new Exception("发生错误: 网站" +
36                     new FileInfo("fileName").DirectoryName
37                     + "目录下没有正确的.Config文件");
38             }
39 
40             cfm = new ConfigFilesManager(configFilePath, typeof(T));
41             return (T)cfm.LoadConfig();
42         }
43         #endregion
44 
45     }

ConfigFileManager它是一个对文件进行管理的类,它将配置文件反序列化成对象,并提供一段时间后,自动生成新版本的对象,为了线程安全,使用了lock

  1  /// <summary>
  2     /// 基本文件配置信息管理者
  3     /// </summary>
  4     internal class ConfigFilesManager
  5     {
  6 
  7         #region 私有
  8         /// <summary>
  9         /// 配置接口
 10         /// </summary>
 11         IConfiger configer;
 12         /// <summary>
 13         /// 锁对象
 14         /// </summary>
 15         object lockHelper = new object();
 16 
 17         /// <summary>
 18         /// 配置文件修改时间
 19         /// </summary>
 20         DateTime fileChangeTime;
 21 
 22         /// <summary>
 23         /// 配置文件所在路径
 24         /// </summary>
 25         string fileName = null;
 26 
 27         Type configType = null;
 28 
 29         #endregion
 30 
 31         #region 属性
 32 
 33         /// <summary>
 34         /// 当前配置类的实例 接口
 35         /// </summary>
 36         internal IConfiger IconfigInfo
 37         {
 38             get { return configer; }
 39             set { configer = value; }
 40         }
 41 
 42         /// <summary>
 43         /// 配置文件所在路径
 44         /// </summary>
 45         internal string ConfigFilePath
 46         {
 47             get { return fileName; }
 48 
 49         }
 50 
 51         #endregion
 52 
 53         #region 构造
 54 
 55         /// <summary>
 56         /// 初始化文件修改时间和对象实例
 57         /// </summary>
 58         internal ConfigFilesManager(string fileName, Type type)
 59         {
 60             this.fileName = fileName;
 61             //得到配置文件的  改时间    
 62             this.configType = type;
 63             fileChangeTime = File.GetLastWriteTime(this.fileName);
 64             this.configer = ConfigSerialize.DeserializeInfo(this.fileName, this.configType);
 65         }
 66 
 67         #endregion
 68 
 69         #region 配置操作
 70 
 71         #region 加载配置类
 72         /// <summary>
 73         /// 加载配置类
 74         /// </summary>
 75         /// <returns></returns>
 76         internal IConfiger LoadConfig()
 77         {
 78             return IconfigInfo as IConfiger;
 79         }
 80         #endregion
 81 
 82         #region 重设配置类实例
 83         /// <summary>
 84         /// 重设配置类实例
 85         /// </summary>
 86         /// <returns></returns>
 87         internal IConfiger LoadRealConfig()
 88         {
 89             lock (lockHelper)
 90             {
 91                 DateTime newfileChangeTime = File.GetLastWriteTime(this.fileName);
 92                 if (!newfileChangeTime.Equals(this.fileChangeTime))
 93                 {
 94                     IconfigInfo = ConfigSerialize.DeserializeInfo(ConfigFilePath, this.configType);
 95                     this.fileChangeTime = newfileChangeTime;
 96                 }
 97             }
 98             return IconfigInfo as IConfiger;
 99         }
100         #endregion
101 
102         #region 保存配置
103         /// <summary>
104         /// 保存配置
105         /// </summary>
106         /// <returns></returns>
107         internal bool SaveConfig()
108         {
109             lock (lockHelper)
110             {
111                 return ConfigSerialize.Serializer(ConfigFilePath, IconfigInfo);
112             }
113         }
114         #endregion
115 
116         #endregion
117 
118     }

ConfigSerialize它是一个配置文件序列化和反序列化的功能类,它返回的对象必须是继承自IConfiger接口的对象

 1     /// <summary>
 2     /// 配置序列化操作类
 3     /// </summary>
 4     internal class ConfigSerialize
 5     {
 6         #region 反序列化指定的类
 7 
 8         /// <summary>
 9         /// 反序列化指定的类
10         /// </summary>
11         /// <param name="configfilepath">config 文件的路径</param>
12         /// <param name="configtype">相应的类型</param>
13         /// <returns></returns>
14         public static IConfiger DeserializeInfo(string path, Type type)
15         {
16 
17             IConfiger iconfiginfo;
18             FileStream fs = null;
19             try
20             {
21                 fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
22                 XmlSerializer serializer = new XmlSerializer(type);
23                 iconfiginfo = (IConfiger)serializer.Deserialize(fs);
24             }
25             catch (Exception ex)
26             {
27                 throw ex;
28             }
29             finally
30             {
31                 if (fs != null)
32                 {
33                     fs.Close();
34                 }
35             }
36 
37             return iconfiginfo;
38         }
39 
40 
41 
42         #endregion
43 
44         #region 保存(序列化)指定路径下的配置文件
45 
46         /// <summary>
47         /// 保存(序列化)指定路径下的配置文件
48         /// </summary>
49         /// <param name="configFilePath">指定的配置文件所在的路径(包括文件名)</param>
50         /// <param name="configinfo">被保存(序列化)的对象</param>
51         /// <returns></returns>
52         public static bool Serializer(string path, IConfiger Iconfiginfo)
53         {
54             bool succeed = false;
55             FileStream fs = null;
56             XmlSerializer serializer = null;
57             try
58             {
59                 fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
60                 serializer = new XmlSerializer(Iconfiginfo.GetType());
61                 serializer.Serialize(fs, Iconfiginfo);
62                 //成功则将会返回true
63                 succeed = true;
64             }
65             catch (Exception ex)
66             {
67                 throw ex;
68             }
69             finally
70             {
71                 if (fs != null)
72                 {
73                     fs.Close();
74                     serializer = null;
75                 }
76             }
77 
78             return succeed;
79         }
80 
81         #endregion
82     
83     }

IConfiger它是配置信息实体的统一接口,它提供了统一的配置信息操作返回类型,在读取具体配置信息时,只要类型强转换就可以了。

1 namespace ConfigCache
2 {
3     using System;
4     /// <summary>
5     /// 配置信息类接口
6     /// </summary>
7     public interface IConfiger { }
8 }

可能有些园友会问,那配置信息的实体呢及配置信息的文件呢?

我要告诉您的是,这些信息是与应用领域相关的,所以不在这个项目中呈现,它要应用到具体的领域项目中,就像这样:

在每一个领域解决方案的WEB项目中,都有一个Configs文件夹,我们的配置信息文件和实体都在这里显示,它们是成对出现的,如WebConfig.cs它是一个网站信息配置的实体,而对应的WebConfig.Config就是它对应的配置信息文件,它们的代码如下:

1 namespace TEstMv3.Config
2 {
3     public class WebConfig : IConfiger
4     {
5         public string PageSize { get; set; }
6         public string CategoryID { get; set; }
7     }
8 }

webconfig.config是一个XML标准的文件:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <WebConfig>
3   <PageSize>10</PageSize>
4   <CategoryID>2</CategoryID>
5 </WebConfig>

其中<WebConfig>是实体文件的类名,这个要注意一下。

调用用时,可以这样:

1  new ConfigCache.ConfigFactory().GetConfig<WebConfig>().PageSize;

好了,事实上现在我们就可以工作了,而对于怎么去提升配置文件读取的性能,我会另外写一篇文件的,介请收看。

相关文章:

面向服务架构~全局配置文件也面向服务了

面向服务架构~全局配置文件也面向服务了~续(对性能的优化)

面向服务架构~全局配置文件也面向服务了~再续(引入Cache机制)

本文转自博客园张占岭(仓储大叔)的博客,原文链接:面向服务架构~全局配置文件也面向服务了,如需转载请自行联系原博主。

目录
相关文章
|
1月前
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
2月前
|
存储 Linux KVM
Proxmox VE (PVE) 主要架构和重要服务介绍
Proxmox VE (PVE) 是一款开源的虚拟化平台,它基于 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 技术,支持虚拟机和容器的运行。PVE 还提供高可用集群管理、软件定义存储、备份和恢复以及网络管理等企业级功能。
1005 7
|
3月前
|
存储 NoSQL 关系型数据库
MPP架构数据仓库使用问题之Visibility bitmap表被删除的文件信息是如何记录的
MPP架构数据仓库使用问题之Visibility bitmap表被删除的文件信息是如何记录的
|
4月前
|
安全 前端开发 JavaScript
逆向海淘代购集运系统:sugargoo的技术架构与创新服务解读
逆向海淘代购集运系统整合中国电商资源,为海外用户提供便捷购物及物流服务,降低购物成本。sugargoo系统搭建攻略包括: - **需求分析与规划**: 深入了解目标市场需求,明确服务特色。 - **平台开发**: 选用合适技术栈,开发关键功能模块,集成电商数据。 - **物流合作**: 建立物流合作关系,集成物流API提升自动化。 - **支付解决方案**: 支持多种支付方式,保障支付安全。 - **客户服务**: 提供多语言支持,建设专业客服团队。 - **营销与推广**: 优化SEO,利用社交媒体扩大品牌影响。
|
27天前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性?
微服务架构中,如何确保服务之间的数据一致性?
|
1月前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
52 3
|
2月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
2月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
43 5
|
2月前
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
50 3
|
2月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。