C#でクラスオブジェクトの初期化を改善するにはどうすればよいですか?

jitendragarg

私は初期化され、既存のアプリでクラスを持っているイベントが発生するたびに使用して、XMLConfigManager objXMLConfig = new XMLConfigManager();

明らかにそうすることは意味がなく、静的クラスを持つためのより良い方法があります。ただし、同じクラスがシステムレジストリを読み取り、アクセスする適切なデータベースを見つけます。以下は、クラスのコンストラクターからのコードです。

    public XMLConfigManager()
    {
        RegistryKey objRKConfigGroup = Registry.LocalMachine.OpenSubKey("Software\\......");
        strFilePath = (string)objRKConfigGroup.GetValue("XMLFilePath");
        objRKConfigGroup.Close();
        string strApplicationName = (string)CacheHandler.GetCache().GetCachedElement("APPLICATION");
        this.ApplicationName = strApplicationName;
    }

私はこれを改善する方法を見つけようとしているので、私たちはいつもレジストリに行くことはありません。代わりに、IISキャッシュを更新して、レジストリ値が変更された場合(データベースのIPが変更された場合、または新しいバージョンがリリースされた場合)、レジストリ値を更新できます。

今の質問は:

静的クラスは良い選択ですか?または、シングルトンを使用する必要がありますか?または私が逃した他のより良いオプションはありますか?

次に、XMLConfigManager objXMLConfig = new XMLConfigManager();すべての場所で行を変更する必要がありますか(合計で約2,000以上のイベントハンドラー)。

PSレジストリアクセスイベントを減らす方が速いはずだという事実を考えています。私はその考えについて正しいことを願っています。また、質問がより良いスタック交換セクションに属している場合は、私に知らせてください。そこに移動します。

編集:

詳細:コンストラクターは、単一のレジストリキーのみを読み取ろうとしています。レジストリキーには、実際の構成ファイルを見つけることができるように、デフォルトのファイルパス(アプリケーションのインストール時に保存される)が格納されますConfigData.xml

このクラスの残りのコードはConfigData.xml、さまざまなxml要素のファイルを読み取ることです。関数の例:

        public string GetConfigItem( string strConfigGroupID, string strConfigItemID, out bool bIsCacheable )   {

        string  strValue;           //string which holds the Configuration item id

        ///- Get the XML Dom document which contains configuration data
        XmlDocument objXmlDocument  = OpenXML();

        ///- Get the Configuration Group Node by using XPath syntax.            
        XmlNode objXmlAppNode           = objXmlDocument.DocumentElement.SelectSingleNode( "Nsp:Application[@Name='" + this.strAppName + "']", xmlNsp );
        XmlNode objXmlConfigGroupNode   = objXmlAppNode.SelectSingleNode( ".//Nsp:ConfigGroup[@ID='" + strConfigGroupID + "']", xmlNsp );

        ///- Get the Configuration Item Node for the specified Group by using XPath syntax.
        XmlNode objXmlConfigItemNode    = objXmlAppNode.SelectSingleNode( ".//Nsp:ConfigGroup[@ID='" + strConfigGroupID + "']/ConfigItem[@ID='" + strConfigItemID + "']", xmlNsp );

        ///- Read the value attribute from Configuration Item node.
        strValue    = objXmlConfigItemNode.Attributes[ "Value" ].Value;

        ///- get "IsCacheable" value of configuration group, whether config data can be cacheable or not.
        bIsCacheable    = Convert.ToBoolean( objXmlConfigGroupNode.Attributes[ "IsCacheable" ].Value );

        ///- Return the Configuration Item value.
        return  strValue;
    }

他のクラスは、次のコードを使用してこのクラスにアクセスします。

XMLConfigManager objConfig = new XMLConfigManager();
String prodDBConnectionString = objConfig.GetConfigItem ("ConnectionStrings", "ProductionDB", isCacheable);

上記のコードの2行目は、アプリケーションが読み取る必要のあるもの(一時フォルダーのパス、接続文字列、レポートパス、電子メールサーバーの設定など)に基づいてパラメーターを変更します。

このクラスが呼び出されるすべてのイベントハンドラーに大きな変更を加えることなく、このクラスをそのまま置き換えるだけのことをしたいと思います。私は当初、シングルトンのルートに行くことを計画していました。ただし、より良い解決策はありがたいです(レジストリの要件全体を置き換える場合でも)。

Moerwald

静的クラスは良い選択ですか?

静的クラスには、呼び出し元のクラスに依存関係が追加されるという欠点があり、単体テストを介してコードをテストするのがより複雑になります。

または、シングルトンを使用する必要がありますか?または私が逃した他のより良いオプションはありますか?

次のことを検討すれば、シングルトンは問題ないかもしれません。

  • クラスの所有者になることができる単一のクラスがコードベースにありません
  • 怠惰な初期化が必要です
  • シングルトンへのグローバルアクセスを提供する代替方法はありません

したがって、シングルトンを使用しても問題ない場合があります。を作成しIRegistrationCacheます。コードビハインドはキャッシュを処理するため、レジストリキーは1回だけ読み取られ、値はオブジェクトに格納されます。次にXMLConfigManager、追加のIRegistrationCacheCTORパラメーターを拡張します->クラスをよりテストしやすくします。この場合、シングルトンへの追加の呼び出しで2k以上のCTOR呼び出しを拡張し、CTORを介して追加する必要があります。それを取り除くために、を返すファクトリオブジェクトを作成しますIRegistrationCacheこのステップでは、ファクトリクラスの追加の初期化ロジックを非表示にします-> CTORを拡張する場合は、2k以上の場所ではなく1つの場所で拡張するだけで済みます。イベントを実装するさまざまなクラスを拡張して、ファクトリオブジェクト(インターフェイスの背後に非表示にする必要があります)を受け取る必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#の多次元配列で行うように、Matrixオブジェクトを初期化するにはどうすればよいですか?

分類Dev

コンストラクターでC ++オブジェクトメンバー変数を初期化するにはどうすればよいですか?

分類Dev

オブジェクトの配列を初期化するにはどうすればよいですか?

分類Dev

テンプレートBSTクラスのオブジェクト初期化を修正するにはどうすればよいですか?

分類Dev

このクラスオブジェクトを削除するにはどうすればよいですか?(C ++)

分類Dev

JavaでGraphicsオブジェクトを初期化するにはどうすればよいですか?

分類Dev

AutowireオブジェクトをApplicationListenerで初期化するにはどうすればよいですか?

分類Dev

このオブジェクトのインスタンス化方法を改善するにはどうすればよいですか?

分類Dev

デスクトップC#アプリでオブジェクトクラスの名前をルートとして追加するJsonとしてオブジェクトをシリアル化するにはどうすればよいですか?

分類Dev

div_tオブジェクトを初期化するにはどうすればよいですか?

分類Dev

このJSONでC#オブジェクトを作成するにはどうすればよいですか

分類Dev

C ++でオブジェクトを初期化解除するにはどうすればよいですか?

分類Dev

スレッド内のオブジェクトを初期化してから他の場所で使用するにはどうすればよいですか?

分類Dev

C#の静的クラスからアンマネージドオブジェクトを破棄するにはどうすればよいですか?

分類Dev

コンストラクターが初期化されている場合、オブジェクトの配列を初期化するにはどうすればよいですか?C ++

分類Dev

オブジェクトのオブジェクトに対する反復を改善するにはどうすればよいですか?

分類Dev

クラスのオブジェクトを動的に作成するにはどうすればよいですか?

分類Dev

親クラスのオブジェクトを使用してサブクラスのオブジェクトを初期化するにはどうすればよいですか?

分類Dev

クラスのコンストラクターでオブジェクトの2Dベクトルを初期化するにはどうすればよいですか?(C ++)

分類Dev

C#のクラスで特定のタイプのオブジェクトを見つけるにはどうすればよいですか?

分類Dev

オブジェクトキーの初期値を設定するにはどうすればよいですか?

分類Dev

初期化されたオブジェクトを渡すにはどうすればよいですか

分類Dev

既存の基本クラスオブジェクトから派生クラスオブジェクトを作成するにはどうすればよいですか?

分類Dev

C#でテスト目的のモックタスクオブジェクトを作成するにはどうすればよいですか?

分類Dev

OpenMP threadprivateディレクティブでオブジェクトの直接初期化を使用するにはどうすればよいですか?

分類Dev

初期化中にクラスへのコンストラクター呼び出しでInputStreamオブジェクトのFileInputStreamオブジェクトに対応するにはどうすればよいですか?

分類Dev

オブジェクトの状態が時間によって変化するクラスを設計するにはどうすればよいですか?

分類Dev

連続する属性に基づいて、クラスのオブジェクトをグループ化するにはどうすればよいですか?

分類Dev

Typescriptでオブジェクトまたは通常のパラメータコンストラクタを使用して初期化できるクラスを作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    C#の多次元配列で行うように、Matrixオブジェクトを初期化するにはどうすればよいですか?

  2. 2

    コンストラクターでC ++オブジェクトメンバー変数を初期化するにはどうすればよいですか?

  3. 3

    オブジェクトの配列を初期化するにはどうすればよいですか?

  4. 4

    テンプレートBSTクラスのオブジェクト初期化を修正するにはどうすればよいですか?

  5. 5

    このクラスオブジェクトを削除するにはどうすればよいですか?(C ++)

  6. 6

    JavaでGraphicsオブジェクトを初期化するにはどうすればよいですか?

  7. 7

    AutowireオブジェクトをApplicationListenerで初期化するにはどうすればよいですか?

  8. 8

    このオブジェクトのインスタンス化方法を改善するにはどうすればよいですか?

  9. 9

    デスクトップC#アプリでオブジェクトクラスの名前をルートとして追加するJsonとしてオブジェクトをシリアル化するにはどうすればよいですか?

  10. 10

    div_tオブジェクトを初期化するにはどうすればよいですか?

  11. 11

    このJSONでC#オブジェクトを作成するにはどうすればよいですか

  12. 12

    C ++でオブジェクトを初期化解除するにはどうすればよいですか?

  13. 13

    スレッド内のオブジェクトを初期化してから他の場所で使用するにはどうすればよいですか?

  14. 14

    C#の静的クラスからアンマネージドオブジェクトを破棄するにはどうすればよいですか?

  15. 15

    コンストラクターが初期化されている場合、オブジェクトの配列を初期化するにはどうすればよいですか?C ++

  16. 16

    オブジェクトのオブジェクトに対する反復を改善するにはどうすればよいですか?

  17. 17

    クラスのオブジェクトを動的に作成するにはどうすればよいですか?

  18. 18

    親クラスのオブジェクトを使用してサブクラスのオブジェクトを初期化するにはどうすればよいですか?

  19. 19

    クラスのコンストラクターでオブジェクトの2Dベクトルを初期化するにはどうすればよいですか?(C ++)

  20. 20

    C#のクラスで特定のタイプのオブジェクトを見つけるにはどうすればよいですか?

  21. 21

    オブジェクトキーの初期値を設定するにはどうすればよいですか?

  22. 22

    初期化されたオブジェクトを渡すにはどうすればよいですか

  23. 23

    既存の基本クラスオブジェクトから派生クラスオブジェクトを作成するにはどうすればよいですか?

  24. 24

    C#でテスト目的のモックタスクオブジェクトを作成するにはどうすればよいですか?

  25. 25

    OpenMP threadprivateディレクティブでオブジェクトの直接初期化を使用するにはどうすればよいですか?

  26. 26

    初期化中にクラスへのコンストラクター呼び出しでInputStreamオブジェクトのFileInputStreamオブジェクトに対応するにはどうすればよいですか?

  27. 27

    オブジェクトの状態が時間によって変化するクラスを設計するにはどうすればよいですか?

  28. 28

    連続する属性に基づいて、クラスのオブジェクトをグループ化するにはどうすればよいですか?

  29. 29

    Typescriptでオブジェクトまたは通常のパラメータコンストラクタを使用して初期化できるクラスを作成するにはどうすればよいですか?

ホットタグ

アーカイブ