2

因此,我为 C# 上的特定需求编写了一个服务器,现在我正在寻找舒适的方法来管理这个服务器。起初它是一个简单的基于 Web 的管理器,但这不是可扩展的解决方案,因为我的服务器架构每天都在变化。所以现在我明白了,最舒适和可扩展的解决方案是命令行界面。但是,我根本不想使用原始的 IF\CASE(C# 应用程序中的命令行界面)结构。所以我的问题是:

例如我有一个服务器类:

public class Server
    {
        private int succes_interval;
        private int fail_interval;
        private int threshold;
        private int failed_requests;
        private int request_timeout;
        private int update_timer;
        private string updt_path;
        private DateTime start_time;
        private bool snmp_enabled;
        private int snmp_port;
        [XmlIgnore()]
        public string Version { get { return Assembly.GetEntryAssembly().GetName().Version.ToString(); } }
        [XmlIgnore()]
        public string Path { get { return Assembly.GetEntryAssembly().Location; } }
        [XmlIgnore()]
        public string ServerName { get { return System.Environment.MachineName.ToLower(); } }
        [XmlIgnore()]
        public int SuccessInterval { get { return succes_interval; } }
        public void SetSuccessInterval(int interval) { succes_interval = interval; }
        [XmlIgnore()]
        public int FailInterval { get { return fail_interval; } }
        public void SetFailInterval(int interval) { fail_interval = interval; }
        [XmlIgnore()]
        public int FailThreshold { get { return threshold; } }
        public void SetFailThreshold(int thresh) { threshold = thresh; }
        [XmlIgnore()]
        public int FailedRequests { get { return failed_requests; } }
        public void SetFailedRequests(int value) { threshold = value; }
        [XmlElement("RequestTimeout")]
        public int RequestTimeout { get { return request_timeout; } set { request_timeout = value; } }
        [XmlIgnore()]
        public int UpdateCheckInterval { get { return update_timer; } set { update_timer = value; } }
        [XmlElement("UpdatePath")]
        public string UpdatePath { get { return updt_path; } set { updt_path = value; } }
        [XmlElement("SNMPEnabled")]
        public bool SNMPEnabled { get { return snmp_enabled; } set { snmp_enabled = value; } }
        [XmlElement("SNMPPort")]
        public int SNMPPort { get { return snmp_port; } set { snmp_port = value; } }
}

我想通过命令“服务器阈值 50”在运行时设置这个变量。不管如何在 (Telnet\ssh\http\whateverprotocol) 中传递命令。或者例如命令“show server”列出了这个对象中的所有变量。

我知道它必须是一种树方法,但是有人可以给我一个实现它的方向。

4

2 回答 2

1

您可以使用字符串命令字典和函数委托。Dictionary<string, Func<string, object>>. 当您收到一些输入时,只需通过字典中的每个键来查看他们是否输入.StartsWith()了该键的字符串,如果是,则将其余部分发送给函数,然后您可以使用返回的值进行回复。

如何添加/实现接口的示例:

myDict = new Dictionary<string, Func<string, object>>();

//add each handler below
myDict.Add("server threshold", (str) =>
{
    int threshold;
    if (int.TryParse(str, out threshold))
        SetFailThreshold(threshold);
    else
        return false;
    return true;
});
于 2014-03-03T20:59:22.667 回答
0

您可以使用 Iron python 作为 CLI,并使用 python 脚本来处理您可能需要的任何内容

于 2014-03-03T20:40:06.020 回答