zoukankan      html  css  js  c++  java
  • ZConfig手册

    ZConfig手册

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

    项目地址:https://gitcafe.com/atskyline/ZConfig

    使用方法

    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: <import resource="assembly://ZConfig/ZConfig/ZConfig.xml" />

    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: <?xml version="1.0" encoding="utf-8" ?>
       2: <objects xmlns="http://www.springframework.net" 
       3:          xmlns:aop="http://www.springframework.net/aop">
       4:  
       5:     <object id="ProxyCreator"
       6:         type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop"/>
       7:  
       8:     <!--Pointcut-->
       9:     <object id="ConfigInterfacePointcut" 
      10:             type="ZConfig.Pointcut.ConfigInterfacePointcut, ZConfig" />
      11:  
      12:     <object id="ModifyConfigPointcut"
      13:             type="ZConfig.Pointcut.ModifyConfigPointcut, ZConfig" />
      14:  
      15:     <!--Persistance-->
      16:     <object id="XmlPersistance"
      17:             type="ZConfig.Persistance.XmlPersistance, ZConfig" />
      18:  
      19:     <!--Advice-->
      20:     <object id="LoadConfigAdvice"
      21:             type="ZConfig.Advice.LoadConfigAdvice, ZConfig">
      22:         <property name="ConfigPersistance" ref="XmlPersistance" />
      23:     </object>
      24:  
      25:     <object id="SaveConfigAdvice"
      26:             type="ZConfig.Advice.SaveConfigAdvice, ZConfig">
      27:         <property name="ConfigPersistance" ref="XmlPersistance" />
      28:     </object>
      29:  
      30:     <!--Advisor-->
      31:     <object type="Spring.Aop.Support.DefaultPointcutAdvisor,Spring.Aop">
      32:         <property name="Pointcut" ref="ConfigInterfacePointcut" />
      33:         <property name="Advice" ref="LoadConfigAdvice" />
      34:     </object>
      35:  
      36:     <object type="Spring.Aop.Support.DefaultPointcutAdvisor,Spring.Aop">
      37:         <property name="Pointcut" ref="ModifyConfigPointcut" />
      38:         <property name="Advice" ref="SaveConfigAdvice" />
      39:     </object>
      40:  
      41: </objects>

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

    已知问题

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

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

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

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

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

  • 相关阅读:
    Navigator对象
    Location对象
    History 对象
    计时器用法
    window对象
    某班的成绩出来了,现在老师要把班级的成绩打印出来,和 显示当前时间
    牛客练习赛14A(唯一分解定理)
    贪心法(举例子强行凑规律)
    线性筛(欧拉筛法)
    欧拉函数
  • 原文地址:https://www.cnblogs.com/atskyline/p/3062708.html
Copyright © 2011-2022 走看看