c# - 如何安全地将静态类转换为 C# 中的实例化类

标签 c# .net architecture

我最近(几个月前)换了工作,并继承了一个代码库,它尽可能多地违反每一个 SOLID 原则。似乎编写这段代码的人决定详细研究每一个良好的编码实践,并尽可能频繁地、最彻底地违反它们。

我是该产品的唯一开发人员 - 组织中没有人知道代码,而且代码库太大太复杂而无法完全重写。我正在寻找可以使代码库灵活和健壮的最高值(value)更改。也不是放弃该产品的选择。

产品所有问题的根源,都源于一组核心业务逻辑数据结构的类。这些类有很多问题,但我真正感兴趣的是以下内容:

public static class NetCollection
{
    private static Logger LogFile { get { return Logger.GetMethodLogger(2); } }
    // Declare local variables.
    private static Dictionary<string, NetObject> netObjectHashTable;
    private static Dictionary<string, NetTitle> titlePropertyHashTable;
    private static Dictionary<string, NetObject> referenceDataHashTable;
    private static Dictionary<int, SortedDictionary<string, int>> picklistHashTable;

    public static IEnumerable<NetObject> NetObjects
    {
        get
        {
            return netObjectHashTable.Values;
        }
    }

    static NetCollection()
    {
        netObjectHashTable = new Dictionary<string, NetObject>();
        titlePropertyHashTable = new Dictionary<string, NetTitle>();
        referenceDataHashTable = new Dictionary<string, NetObject>();
        picklistHashTable = new Dictionary<int, SortedDictionary<string, int>>();
    }

    public static void AddNetObject(NetObject newObject)
    {
        if (newObject == null)
            return;
        if (newObject.TitleType == "Reference Data")
        {
            // Check if hash table contains key
            if (!referenceDataHashTable.ContainsKey(newObject.ID.ToString()))
            {
                referenceDataHashTable.Add(newObject.ID.ToString(), newObject);
            }
        }
        else
        {
            // Check if hash table contains key
            if (!netObjectHashTable.ContainsKey(newObject.ID.ToString()))
            {
                netObjectHashTable.Add(newObject.ID.ToString(), newObject);
            }
        }
    }
}

为了简洁起见,我从这个类中删除了很多其他方法。

如您所见,围绕此类存在大量问题(在静态类中存储状态是一种巨大的代码味道 - 围绕该类编写整个应用程序简直是疯了)。

我目前的意图是将此类重构为一个合适的单例类(并最终重构为一个常规类,以便我可以让用户同时打开多个文档)。

我应该这样做吗?

进行此更改的最大风险是什么?我可以采取任何方法来降低进行此更改的风险吗?

最佳答案

是的,转换为单例似乎是很好的第一步。它仍然不是线程安全的,但这是一个开始。然后,您可以将它从 true 单例更改为允许 构造单独的实例,但也具有与单例相同的“默认”实例。 (当然,您可以将“实例持有者”分离到一个单独的类中。)这将允许您开始编写可测试的代码,每次都从一个新的实例开始。

之后,您可以开始引入依赖注入(inject),以便每个需要访问同一实例的类都获得它...并删除“默认”实例。

当然,如果你能减少需要访问同一个实例的类的数量,那会更好。

对于线程,您需要锁定每个方法,或者使用 ConcurrentDictionary

关于c# - 如何安全地将静态类转换为 C# 中的实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17716874/

相关文章:

c# - 导出到 Excel 错误

c# - 在 .NET 中,如何执行此 Oracle PL/SQL 程序?

asp.net - 防止方法的大规模阴影

javascript - JQuery、函数编排

javascript - CryptoJS 解密 C# DES 加密文件失败

c# - VC++ 项目总是过时

c# - 单核处理器上的 PLinq

.net - 不标记类 <Serializable()> 的影响

c# - .NET 的 future 版本是否支持 C# 中的元组?

qt - 为什么 Qt Creator 的核心是插件?