ThreadStatic的用法(单元测试)

时间:2014-03-10 22:10:51

标签: c# multithreading unit-testing

我已经编写了以下内容来存储Singleton以进行单元测试。

 public static class LocalisationSetter
    {
        [ThreadStatic]
        private static CultureInfo _cultureInfo;

        public static void Set(CultureInfo cultureInfo)
        {
            _cultureInfo = cultureInfo;

            Localisation.Current.Culture = _cultureInfo; // Setting The singleton.
        }
    }

在我的测试中,我做了类似下面的事情:

LocalisationSetter.Set(new CultureInfo("fr-FR"));

上述方法似乎有点“脏”......

只是想知道是否有更好的方法。我需要确保对“本地化”的更改只对线程可见。

1 个答案:

答案 0 :(得分:3)

拥有一个“Setter”的类是一种相当奇特的模式。正如DStanley评论的那样,如果没有使Localization.Current线程静态,上述内容将无法正常工作:

public class Localization{

   [ThreadStatic]
   private static Localization _current;

   public static Current {
     get { _current = _current ?? new Localization(); return _current }
     set { _current = value; }
   }
}

话虽这么说,这通常是一种非常特殊的模式,因为这有效地创建了“全局”变量,这通常会使单元测试和软件维护变得更加复杂。

(上面的代码创建了可能随时更改的短暂状态,从而影响代码的行为)。

考虑使用依赖注入,或者至少将这些“全局”变量组织到一些聚合对象中,以便更容易跟踪这些上下文对象的事实。

相关问题