如何改善C#中的类对象初始化?

吉滕德拉格

我在现有应用程序中有一个类,该类每次触发事件时都会使用进行初始化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使用附加的IRegistrationCacheCTOR参数扩展->使您的类更具可测试性。在这种情况下,您必须将对2k + CTOR的调用扩展为对singleton的附加调用,然后通过CTOR将其添加。为了摆脱这种情况,我将创建一个返回的工厂对象IRegistrationCache此步骤在工厂类中隐藏了其他初始化逻辑->如果扩展CTOR,则只需将其扩展到一个位置,而不是2k +个位置。需要扩展实现事件的不同类以接收工厂对象(应将其隐藏在接口后面)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章