私は初期化され、既存のアプリでクラスを持っているイベントが発生するたびに使用して、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行目は、アプリケーションが読み取る必要のあるもの(一時フォルダーのパス、接続文字列、レポートパス、電子メールサーバーの設定など)に基づいてパラメーターを変更します。
このクラスが呼び出されるすべてのイベントハンドラーに大きな変更を加えることなく、このクラスをそのまま置き換えるだけのことをしたいと思います。私は当初、シングルトンのルートに行くことを計画していました。ただし、より良い解決策はありがたいです(レジストリの要件全体を置き換える場合でも)。
静的クラスは良い選択ですか?
静的クラスには、呼び出し元のクラスに依存関係が追加されるという欠点があり、単体テストを介してコードをテストするのがより複雑になります。
または、シングルトンを使用する必要がありますか?または私が逃した他のより良いオプションはありますか?
次のことを検討すれば、シングルトンは問題ないかもしれません。
したがって、シングルトンを使用しても問題ない場合があります。を作成しIRegistrationCache
ます。コードビハインドはキャッシュを処理するため、レジストリキーは1回だけ読み取られ、値はオブジェクトに格納されます。次にXMLConfigManager
、追加のIRegistrationCache
CTORパラメーターでを拡張します->クラスをよりテストしやすくします。この場合、シングルトンへの追加の呼び出しで2k以上のCTOR呼び出しを拡張し、CTORを介して追加する必要があります。それを取り除くために、を返すファクトリオブジェクトを作成しますIRegistrationCache
。このステップでは、ファクトリクラスの追加の初期化ロジックを非表示にします-> CTORを拡張する場合は、2k以上の場所ではなく1つの場所で拡張するだけで済みます。イベントを実装するさまざまなクラスを拡張して、ファクトリオブジェクト(インターフェイスの背後に非表示にする必要があります)を受け取る必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加