我在现有应用程序中有一个类,该类每次触发事件时都会使用进行初始化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();
在每个地方更改行(总共大约2k +个事件处理程序)。
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);
上面代码的第二行根据应用程序需要读取的内容更改参数(临时文件夹路径,连接字符串,报告路径,电子邮件服务器设置等)。
我想做一些简单地替换此类的事情,而无需在调用该类的所有事件处理程序中进行大量更改。我最初打算走单身路线。但是,任何更好的解决方案都是值得赞赏的(甚至取代了注册表的全部要求)。
静态课程是一个不错的选择吗?
静态类的缺点是,它们会将依赖项添加到您的调用类中,这使得通过单元测试来测试代码变得更加复杂。
还是我应该使用单例?还是我错过了其他更好的选择?
如果考虑以下事项,则单例可能没问题:
因此,使用单例可能适合您的情况。我会创建一个IRegistrationCache
。后面的代码负责缓存,因此注册表项仅读取一次,并且值存储在对象中。然后,我将XMLConfigManager
使用附加的IRegistrationCache
CTOR参数扩展->使您的类更具可测试性。在这种情况下,您必须将对2k + CTOR的调用扩展为对singleton的附加调用,然后通过CTOR将其添加。为了摆脱这种情况,我将创建一个返回的工厂对象IRegistrationCache
。此步骤在工厂类中隐藏了其他初始化逻辑->如果扩展CTOR,则只需将其扩展到一个位置,而不是2k +个位置。需要扩展实现事件的不同类以接收工厂对象(应将其隐藏在接口后面)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句