0

在我目前正在进行的一个项目中,我们添加了一个用于访问HttpSessionState对象的包装类。问题在于当前的解决方案意味着您必须编写一些代码来包装功能。我想出了以下解决方案

/// <typeparam name="TKey">Class used for generating key into session state storage.</typeparam>
/// <typeparam name="T">Type of object to store.</typeparam>
public static class SessionManager<TKey, T>
{
    static SessionManager()
    {
        _key = typeof(TKey).ToString();
    }

    private static readonly string _key;
    public static string Key
    {
        get { return _key; }
    }

     // Other functions ... (Set, IsSet, Remove, etc.)

}

现在您只需使用即可创建所需的存储

using StringStore= Test.SessionManager<System.Boolean, System.String>;
using StringStore2= Test.SessionManager<System.Version, System.String>;

StringStore.Set("I'm here");
StringStore2.Set("I'm also here");

该代码有效并且很好,因为您可以轻松创建包装类(单个 using 语句)并且一切都是静态的。然而,代码有点滥用类型系统,所以可能有点模糊?在我添加它之前,我想得到一些反馈,所以这里有一个问题:

如果您我们正在维护上述系统并遇到上面的代码,您会

  1. 追捕并杀死签入文件的人?
  2. 对聪明的尝试有点恼火,但让它溜走?
  3. 认为这是避免样板代码的好方法吗?

您更喜欢使用文本生成工具] 像T4吗?

感谢您的任何回复,

麦兹

4

2 回答 2

1

因此,您正在使用泛型为字典创建键。我会说这绝对不是一个好主意,原因有几个。

第一个原因是它违反了字典键背后的推理。一个键应该对它所持有的价值具有一定的意义。为什么要在 System.Boolean 下存储一个字符串?System.Boolean 是什么意思?这是否意味着字符串是真或假?像这样的混乱使代码更难支持。我也怀疑键值被用于在代码中的其他地方转换字符串。这显然是字典和泛型的错误混合。

第二个原因是 Session 在用户的会话中共享。因此,由两个不同的开发人员编写的两个完全不同的代码段正在访问这个共享位置。是什么阻止一个开发人员将 System.Boolean 识别为代码中数据 A 的适当键类型,而另一个开发人员使用 System.Boolean 作为代码中数据 B 的键类型?现在,第一个开发人员在访问此存储桶时期望 A,但得到 B。有意义的唯一密钥将防止这种情况发生。

于 2009-04-05T17:53:21.273 回答
0

如果使用 System.Boolean 与 System.Version 只是为了区分不同类型以将 _key 的单独实例放入系统,我的响应将介于 #1 和 #2 之间。至少注释它并创建一些虚拟类型(可能只是空接口)来使用,而不是使用任意 .NET 类型。

我这么说是作为过去 6 个月的主要工作是代码审查的人。如果您与许多其他需要理解该代码的人一起工作,那么如果您至少不给读者一些线索,那么将很难理解和维护。

于 2009-04-05T15:33:15.137 回答