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 に答える