先上一段代码:

        public EnvironmentSetting()
{
var appServer = GetServerSection();
var protocol = GetProtocolSection();
var cacheSection = GetCacheSection();
var scriptSection = GetScriptSection(); CacheGlobalPeriod = cacheSection.ShareExpirePeriod;
CacheUserPeriod = cacheSection.PersonalExpirePeriod; ScriptSysAsmReferences = scriptSection.SysAssemblyReferences;
ScriptAsmReferences = scriptSection.AssemblyReferences;
GamePort = protocol.GamePort;
GameIpAddress = string.IsNullOrEmpty(protocol.GameIpAddress) ? GetLocalIp() : protocol.GameIpAddress; try
{
if (!string.IsNullOrEmpty(appServer.EntityAssemblyName))
{
EntityAssembly = Assembly.LoadFrom(appServer.EntityAssemblyName);
}
}
catch (Exception ex)
{
TraceLog.WriteError("Load entity assembly error:\"{0}\" {1}", appServer.EntityAssemblyName, ex);
}
ActionDispatcher = new ScutActionDispatcher();
InitSerializer();
Reset();
}

  可以看到,配置都是通过 GetServerSection、GetProtocolSection 等API导入的。

  再来看一下 GetServerSction 的具体操作:

        private static AppServerSection GetServerSection()
{
return ConfigManager.Configger.GetFirstOrAddConfig<AppServerSection>();
}
        public AppServerSection()
{
ProductCode = ConfigUtils.GetSetting("Product.Code", );
ProductName = ConfigUtils.GetSetting("Product.Name", "Game");
ProductServerId = ConfigUtils.GetSetting("Product.ServerId", );
UserLoginDecodeKey = ConfigUtils.GetSetting("Product.ClientDesDeKey", "");
ClientVersion = new Version(, , );
Version ver;
if (Version.TryParse(ConfigUtils.GetSetting("Product.ClientVersion", "1.0.0"), out ver))
{
ClientVersion = ver;
} PublishType = ConfigUtils.GetSetting("PublishType", "Release");
ActionTimeOut = ConfigUtils.GetSetting("ActionTimeOut", );
LanguageTypeName = ConfigUtils.GetSetting("Game.Language.TypeName", "Game.src.Locale.DefaultLanguage"); ActionTypeName = ConfigUtils.GetSetting("Game.Action.TypeName");
if (string.IsNullOrEmpty(ActionTypeName))
{
string assemblyName = ConfigUtils.GetSetting("Game.Action.AssemblyName", "GameServer.CsScript");
if (!string.IsNullOrEmpty(assemblyName))
{
ActionTypeName = assemblyName + ".Action.Action{0}," + assemblyName;
}
}
ScriptTypeName = ConfigUtils.GetSetting("Game.Action.Script.TypeName", "Game.Script.Action{0}");
EntityAssemblyName = ConfigUtils.GetSetting("Game.Entity.AssemblyName");
DecodeFuncTypeName = ConfigUtils.GetSetting("Game.Script.DecodeFunc.TypeName", "");
RemoteTypeName = ConfigUtils.GetSetting("Game.Remote.Script.TypeName", "Game.Script.Remote.{0}");
AccountServerUrl = ConfigUtils.GetSetting("AccountServerUrl", "");
}

  ConfigUtils 是控制 app.config 配置的。那么,我们可以很清楚地明白,Scut 的配置,如果在 app.config 中有该字段,则使用配置文件的值,如果没有,则使用程序默认值。

  那么,我们是否可以完全由外部配置来启动,并更加清晰地管理外部配置呢?

        static EnvironmentSetting()
{
bool result;
try
{
result = ConfigManager.Intialize("appServerConfigger");
}
catch (Exception)
{
result = false;
}
if (!result)
{
try
{
ConfigManager.GetConfigger<DefaultAppConfigger>();
}
catch (Exception ex)
{
TraceLog.WriteError("Configger init error:{0}", ex);
}
}
LoadDecodeFunc();
}
        public static bool Intialize(string sectionName)
{
lock (syncRoot)
{
var section = ConfigurationManager.GetSection(sectionName);
if (section is IConfigger)
{
var instance = section as IConfigger;
instance.Install();
_configgerSet.Add(instance);
_configger = instance;
return true;
}
return false;
}
}

  我们可以在 static EnvironmentSetting 中,直接从配置文件中读取全部配置:

ConfigManager.Intialize("appServerConfigger");
ConfigManager.Intialize("ProtocolConfigger");
ConfigManager.Intialize("CacheConfigger");
ConfigManager.Intialize("ScriptConfigger");

  同时,从 DataDefaultConfigger 派生出 appServerConfigger、ProtocolConfigger、CacheConfigger、ScriptConfigger。

  每个 Configger 还应包括相应的配置:AppServerSection、ProtocolSection、CacheSection、ScriptSection。

  每个 Configger 还应重写 LoadConfigData 接口,将数据从 .config 中读入 appServerConfigger 的 AppServerSection 中...

  最后,还应在 app.config 中添加所有的自定义配置节。

  在写 app.config 的过程中出现了问题:

  首先测试性地修改 appServerConfigger,添加测试变量:

    public class DefaultAppConfigger : DefaultDataConfigger
{
public int ProductCode { get; set; }
...
}
  <configSections>
<section name="appServerConfigger" type="ZyGames.Framework.Game.Runtime.DefaultAppConfigger, ZyGames.Framework.Game" requirePermission="false"/>
</configSections> <appServerConfigger>
<add key="ProductCode" value=""/>
</appServerConfigger>

  这样在 GetSection 时,执行 add 操作时就会抛出异常了。

												

Scut:参数导入方式(有遗留疑问)的更多相关文章

  1. mybatis mapper xml文件的导入方式和查询方式

    mybatis mapper xml文件的导入方式和查询方式 ssm框架 Mybatis  mapper与SQLSession的关系 每个基于MyBatis的应用都是以一个SqlSessionFact ...

  2. 将Hive统计分析结果导入到MySQL数据库表中(一)——Sqoop导入方式

    https://blog.csdn.net/niityzu/article/details/45190787 交通流的数据分析,需求是对于海量的城市交通数据,需要使用MapReduce清洗后导入到HB ...

  3. 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  4. EndNote(二)之英文引文导入方式

    在上一篇EndNote教程(一)--基本介绍中介绍了基本使用,今天将来介绍如何将常用文献引文导入EndNote中. EndNote在文献管理方面有着很多优点,可以节约很多精力.但是,不同文献查询网站可 ...

  5. 【hive】——Hive四种数据导入方式

    Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...

  6. [Spring MVC] - SpringMVC的各种参数绑定方式

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...

  7. HIVE几种数据导入方式

    HIVE几种数据导入方式 今天的话题是总结Hive的几种常见的数据导入方式,我总结为四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询 ...

  8. SpringMVC的各种参数绑定方式

    1. 基本数据类型(以int为例,其他类似):2. 包装类型(以Integer为例,其他类似):3. 自定义对象类型:4. 自定义复合对象类型:5. List绑定:6. Set绑定:7. Map绑定: ...

  9. 十一、Struts2封装请求参数的方式

    十一.Struts2封装请求参数的方式 方式一.Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器干的) 注意:表单中的名称要和动作类中的名称一致(这是必须 ...

随机推荐

  1. openStack CentOS虚拟桌面iptables初始化配置

  2. Android中 判断是平板还是手机

    //是平板返回true 不是平板返回false public  boolean isTablet(Context context) { return (context.getResources().g ...

  3. 点击Enter键,文本框焦点改变 分类: WinForm 2014-04-15 10:30 223人阅读 评论(0) 收藏

    一个例子: 一个简单的 登陆界面,有用户名.密码文本框.登陆按钮.  想要实现的效果是,用户输入用户名之后,点击Enter键进入到下一个文本框,同理,输入完密码之后,登陆按钮获得焦点,再次点击Ente ...

  4. JAX-WS + Spring 开发webservice

    通过几天的时间研究了下使用jax-ws来开发webservice,看了网上的一些资料总结出jax-ws的开发大概分为两种. 以下项目使用的spring3.0,jar包可以到官网下载 第一种:使用独立的 ...

  5. 一、cocos2d-x 3.0 final使用httpclient编译到android,须要用到的android.mk

    今天写一个网络框架,在vs上面非常欢快的执行车,心想,尼玛!cocos2d-x 3.0这么方便,预计不久的将来我就能回家种地了,由于不用程序猿了,直接cocos2dstudio拖界面了= =!!. 写 ...

  6. [Angualr 2] Watch for changes

    You can watch for form / control changes by using .valueChanges.observe({...}): this.sku.valueChange ...

  7. [Angular 2] Using Pipes to Filter Data

    Pipes allow you to change data inside of templates without having to worry about changing it in the ...

  8. jquery.scrollTo-min.js

    jquery.scrollTo-min.js 用户返回顶部及动画到目的地,支持目标值.锚点. 用法: 1.引入jQuery 2.$.scrollTo( this.hash || targetValue ...

  9. Java 实现 SSH 协议的客户端登录认证方式--转载

    背景 在开篇之前,让我们先对 SSH 协议有个宏观的大致了解,这样更有利于我们对本文的加深了解.首先要提到的就是计算机网络协议,所谓计算机网络协议,简单的说就是定义了一套标准和规则,使得不同计算机之间 ...

  10. Creating a simple static file server with Rewrite--reference

    Today, I’d like to take a quick moment to demonstrate how to make a simple file server using Rewrite ...