Scut:参数导入方式(有遗留疑问)
先上一段代码:
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:参数导入方式(有遗留疑问)的更多相关文章
- mybatis mapper xml文件的导入方式和查询方式
mybatis mapper xml文件的导入方式和查询方式 ssm框架 Mybatis mapper与SQLSession的关系 每个基于MyBatis的应用都是以一个SqlSessionFact ...
- 将Hive统计分析结果导入到MySQL数据库表中(一)——Sqoop导入方式
https://blog.csdn.net/niityzu/article/details/45190787 交通流的数据分析,需求是对于海量的城市交通数据,需要使用MapReduce清洗后导入到HB ...
- 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...
- EndNote(二)之英文引文导入方式
在上一篇EndNote教程(一)--基本介绍中介绍了基本使用,今天将来介绍如何将常用文献引文导入EndNote中. EndNote在文献管理方面有着很多优点,可以节约很多精力.但是,不同文献查询网站可 ...
- 【hive】——Hive四种数据导入方式
Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...
- [Spring MVC] - SpringMVC的各种参数绑定方式
SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...
- HIVE几种数据导入方式
HIVE几种数据导入方式 今天的话题是总结Hive的几种常见的数据导入方式,我总结为四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询 ...
- SpringMVC的各种参数绑定方式
1. 基本数据类型(以int为例,其他类似):2. 包装类型(以Integer为例,其他类似):3. 自定义对象类型:4. 自定义复合对象类型:5. List绑定:6. Set绑定:7. Map绑定: ...
- 十一、Struts2封装请求参数的方式
十一.Struts2封装请求参数的方式 方式一.Action 本身作为model对象,通过成员setter封装(一个名字为params的拦截器干的) 注意:表单中的名称要和动作类中的名称一致(这是必须 ...
随机推荐
- 使用jquery trigger 触发a标签的click事件取代window.open方法
var ohtml='<div class="friend-dialog tac pt15 pb20">'+ '<div class="f-h32&qu ...
- 多台计算机之间的ssh无密钥登录
在很多分布式系统中,我们最常遇到的一个问题是,需要在服务器集群上保证多台机器之间的SSH无密钥登录.以Hadoop为例,为了方便,我们需要在master和slaves之间配置密钥登录,这样我们启动Ha ...
- pull解析和sax解析的差别
假设在一个XML文档中我们仅仅须要前面一部分数据.可是使用SAX方式或DOM方式会对整个文档进行解析,虽然XML文档中后面的大部分数据我们事实上都不须要解析.因此这样实际上就浪费了处理资源. 使用PU ...
- "Storage Virtualization" VS "Software-Defined Storage"
http://www.computerweekly.com/blogs/StorageBuzz/2013/07/storage-virtualisation-vs-soft.html 这篇blog的目 ...
- Android程序版本更新--通知栏更新下载安装(转)
Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下: 检查当前版本号 AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新 ...
- QT pro文件解析
在QT中使用qmake自动生成pro文件,如果要自己定制工程选项,则需要自行修改pro文件. pro文件有以下关键字:TEMPLATE.TARGET.DESTDIR.DEPENDPATH.INCLUD ...
- The requested URL ***** was not found on this serve
Wamp的Alias具体是干什么用的,后面要研究一下!!!! 我是之前创建了一个站点用Alias,后来把站点文件移到了www下后,除了首页都访问不了了.显示“The requested URL *** ...
- 不同浏览器创建XMLHttpRequest对象
function getXHR() { if (XMLHttpRequest) { return new XMLHttpRequest(); } else { return new ActiveXOb ...
- (转)DEDECMS 如何让栏目外部链接在新窗口中打开
近遇到一个问题,就是dedecms的导航,是用外部链接的,但是原窗口打开不好看,新窗口打开好点.OK,放狗... 1. 查找模板中的head.htm将<li><a href='[fi ...
- android - INSTALL_FAILED_MEDIA_UNAVAILABLE
解决方案是将'AndroidManifest.xml'设置 'installLocation'的属性为'auto'即可.