全局变量的可能替代方案有哪些,哪一个最好?

时间:2014-02-13 09:20:53

标签: c# .net wcf

全局变量有哪些可能的替代方案,哪一个最好? 正如我所听说的那样,使用全局变量并不好。 我正在研究WCF应用程序,并且可能存在多个WCF实例,并且很少有机会使用并发。

此WCF服务将部署到服务器,然后客户端将发送一系列请求,但请求具有一些唯一请求,应在剩余请求中维护。

2 个答案:

答案 0 :(得分:1)

正如评论中所提到的,没有全局变量,但类的静态属性/字段是接近意味着什么。

在WCF代码中使用任何静态属性/字段(保持状态的静态成员)非常小心。每个WCF调用都是同一进程中的一个单独的线程,因此它们将共享静态属性/字段的值。这可能会导致不可预测的结果并且难以调试问题。

  

......我将使用并发的可能性很小

如果代码在WCF中运行,那么它几乎总是并发的。要非常小心。

您可以使用在这种情况下可以帮助您的线程模式(单一并发模式),但您仍需要仔细设计系统。

答案 1 :(得分:1)

变量越“全局”,访问它就越容易。但是,只要应用程序中的每个组件都访问它,您的应用程序就越来越依赖于该变量。您无法更改变量,因为它随处可见。

自动化测试变得丑陋,需要对应用程序的每次修改进行修改,并且不能重用使用全局变量的任何组件。

如果你想使用“全局变量”(公共静态成员)尝试尽可能地限制它的使用,例如当你创建一个类的实例时,将变量的值提供给它的构造函数,以便该课程不依赖于“全球”参考。

更详细地说,你有这个课程:

public class MyUsefulClass 
{
    public void DoSomethingUseful()
    {
        Console.WriteLine("The value is: " + MyGlobalVariables.Variable1);
    }
}

new MyUsefulClass().DoSomethingUseful();

然后,如果您可以引用MyUsefulclass,则只能使用MyGlobalVariables.Variable1。您不能在不具有这些全局变量的其他项目中重用MyUsefulclass

将其重写为:

public class MyUsefulClass 
{
    public MyUsefulClass(string valueToWrite)
    {
        ValueToWrite = valueToWrite;
    }

    public string ValueToWrite { get; private set; }

    public void DoSomethingUseful()
    {
        Console.WriteLine("The value is: " + ValueToWrite);
    }
}

new MyUsefulClass(MyGlobalVariables.Variable1).DoSomethingUseful();
new MyUsefulClass("I don't need globals!").DoSomethingUseful();

在这种情况下,您可以重用MyUsefulClass,而无需在新项目中出现全局变量。你仍然有一个“全局”-ish变量,但是通过这种修改,更少的代码依赖于“它是全局的”。