博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZConfig手册
阅读量:4498 次
发布时间:2019-06-08

本文共 3804 字,大约阅读时间需要 12 分钟。

ZConfig手册

一个基于Spring.Net AOP,实现的一个关于应用程序配置文件的加载和回写的解决方案。通过简单的设置,可以再特定的方法调用前加载配置,方法调用后保存参数。

项目地址:

使用方法

  1. 你需要一个基本的配置对象,例如如下 ProgramConfig.cs

    1: using System;
    2: 
    3: namespace Sample.Config
    4: {
    5:     public class ProgramConfig
    6:     {
    7:         public String ProgramPath { get; set; }
    8:     }
    9: }

2.你需要一个继承于ZConfig.IUseConfig的接口,并在接口中声明配置对象的属性,实现这个接口的所有类将支持由ZConfig自动加载和回写接口中的所有属性(通过反射实现)。例如IUseProgramConfig.cs

1: using ZConfig;
2: namespace Sample.Config
3: {
4:     public interface IUseProgramConfig : IUseConfig
5:     {
6:         ProgramConfig ProgramConfig { get; set; }
7:     }
8: }

3.在你程序中需要配置对象的类中实现自定义的ZConfig.IUseConfig的子接口,并且在有修改配置对象的方法上标记上ModifyConfig特性,例如Program.cs

1: using System;
2: using Sample.Config;
3: using Spring.Context.Support;
4: using ZConfig.Attribute;
5: 
6: namespace Sample
7: {
8:     public interface IProgram
9:     {
10:         void UpdatePath();
11:         void PrintPath();
12:     }
13:     public class Program : IUseProgramConfig, IProgram
14:     {
15:         public ProgramConfig ProgramConfig { get; set; }
16: 
17:         [ModifyConfig]
18:         public virtual void UpdatePath()
19:         {
20:             ProgramConfig.ProgramPath = "../" + ProgramConfig.ProgramPath;
21:         }
22: 
23:         public virtual void PrintPath()
24:         {
25:             Console.WriteLine(ProgramConfig.ProgramPath);
26:         }
27:     }
28: }

4.在你应用程序的Spring配置中中导入ZConfig配置

1: 

5.最后给一个使用的例子

1: static void Main(string[] args)
2: {
3:     var appContext = ContextRegistry.GetContext();
4:     IProgram program = (IProgram)appContext["Program"];
5:     program.PrintPath();
6:     program.UpdatePath();
7:     program.PrintPath();
8:     Console.ReadLine();
9: }

实现简介

除了一个约定用的ZConfig.IUseConfig以外还有以下几个部分

ZConfig.Pointcut

指定AOP的切入点,现在又三个实现

1.ConfigInterfacePointcut

这是另外两个Pointcut的基类,拦截所有实现了IUseConfig的类

2.ModifyConfigPointcut

不仅类要实现IUseConfig,而且方法必须标记[ModifyConfig]

3.NeedConfigPointcut

不仅类要实现IUseConfig,而且方法必须标记[NeedConfig]

ZConfig.Attribute

定义了ModifyConfigAttribute和NeedConfigAttribute用于丰富切入点的选择。

ZConfig.Advice

加载和保存的配置的实现。现在提供了三个Advice

  • LoadConfigAdvice
  • SaveConfigAdvice
  • LoadAndSaveConfigAdvice

实现的思路是获取所有实现的IUseConfig的实例,反射迭代IUseConfig中定义的属性,使用ConfigPersistance 加载 或 保存 配置对象。

ZConfig.Persistance

定义了一个接口IConfigPersistance,用于加载和保存配置

1: namespace ZConfig.Persistance
2: {
3:     public interface IConfigPersistance
4:     {
5:         void LoadTo(object config);
6:         void Save(object config);
7:     }
8: }

还有一个XmlPersistance,使用XML序列化方式保存和加载配置对象

自定义配置

默认配置的行为是,在所有实现了IUseConfig,的类的任何方法调用前加载配置,仅在标记了[ModifyConfig]特性的方法调用后才执行回写配置。默认配置文件如下

1: 
2: 
3:          xmlns:aop="http://www.springframework.net/aop">
4: 
5:     
6:         type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/>
7: 
8:     
9:     
10:             type="ZConfig.Pointcut.ConfigInterfacePointcut, ZConfig" />
11: 
12:     
13:             type="ZConfig.Pointcut.ModifyConfigPointcut, ZConfig" />
14: 
15:     
16:     
17:             type="ZConfig.Persistance.XmlPersistance, ZConfig" />
18: 
19:     
20:     
21:             type="ZConfig.Advice.LoadConfigAdvice, ZConfig">
22:         
23:     
24: 
25:     
26:             type="ZConfig.Advice.SaveConfigAdvice, ZConfig">
27:         
28:     
29: 
30:     
31:     
32:         
33:         
34:     
35: 
36:     
37:         
38:         
39:     
40: 
41: 

通过修改Advice的ConfigPersistance可以改变配置持久化的方式。修改Advisor中Pointcut和Advice可以改变加载和回写的时间和行为。比如所有方法调用前加载调用后回写,或者必须标记[NeedConfig]才去读取配置

已知问题

不支持多个相同类型的配置对象

现在配置文件名的规则为config.GetType().Name + ".xml"

这个导致同类型的配置实例都会存储到同一个文件中去。

不能使用GetHashCode,作为文件名称的一部分,因为默认的HashCode在每次运行时都不同。

可以考虑采用一个维护一个缓存加上更复杂的文件名管理方式,或者强制要求config有一个唯一标示符

转载于:https://www.cnblogs.com/atskyline/archive/2013/05/06/3062708.html

你可能感兴趣的文章
集合、泛型、增强for
查看>>
Public Key Retrieval is not allowed错误
查看>>
Unable to load authentication plugin 'caching_sha2_password'.错误
查看>>
The server time zone value '乱码' 错误
查看>>
require.js的用法
查看>>
基础语言知识C++
查看>>
如何使电脑彻底崩溃!!!!(不要干坏事哦)
查看>>
简单练习题
查看>>
记账本,C,Github,service
查看>>
约数定理(two)
查看>>
Pyenv和pip的安装及配置
查看>>
字典dict
查看>>
squid-正向代理
查看>>
《A First Course in Probability》-chaper7-极限定理-强大数定理
查看>>
Python类型转换+序列操作+基本概念辨析速查手册
查看>>
Python编程之数据结构与算法练习_010
查看>>
vi 常用技巧
查看>>
Android基于TrafficStats实现流量实时监测
查看>>
《微店大数据开发平台架构演进》阅读有感
查看>>
Gym - 101670G Ice cream samples(CTU Open Contest 2017 尺取法)
查看>>