静态变量的替代品?

时间:2010-06-22 07:40:17

标签: c# static wcf

在我的代码中,我使用静态字段来存储特定值。

public static int webServiceId;

我删除了它并使用任何其他解决方案。但该值应在回发后保留。我们不能在这里使用Session或ViewState。因为我正在使用服务(在服务层)。

示例:

我在下面的xyz.cs文件方法中获得了webservice id:

public int SetWebServiceInformation(int? webServiceID, string webServiceName) 
{ 
    context.WebService_InsertUpdate(ref webServiceID, webServiceName);
         webServiceId = webServiceID.Value;
         return webServiceID.Value;

}

然后控件转到另一个不同类文件的方法(比如abd.cs文件)。并且假设在调用方法异常时它将调用我的第一个类文件(xyz.cs)的方法LogError(异常错误)。 当控件返回我们的类文件(xyz.cs)时,我们需要webservice Id。因为我们正在使用它根据webservice Id将异常信息存储到数据库中。

protected void LogError(Exception error)
{
    ----//some logic to get errorLogID//---

    if (errorLogID > 0)
          WebServiceErrorLogging(errorLogID, webServiceId);
    //here we have webServiceId is a static variable
}

3 个答案:

答案 0 :(得分:1)

您是否考虑过实施Singleton

这样你就可以有一个“全局”类来存储参数。

using System.Runtime.CompilerServices;

public class Singleton
{
    private static Singleton Instance = null;
    static readonly object padlock = new object();


    // The private constructor doesnt allos a default public constructor
    private Singleton() {}

    // Synchronized "constructor" to make it thread-safe
    [MethodImpl(MethodImplOptions.Synchronized)]
    private static void CreateInstance()
    {
        lock(padlock)
        {
             if (Instance == null)
             { 
                  Instance = new Singleton();
             }
        }
    }

    public static Singleton GetInstance()
    {
        if (Instance == null) CreateInstance();
        return Instance;
    }

    public int webServiceId {get; set;}


}

// Test class
public class Prueba
{
   private static void Main(string[] args)
   {
     //Singleton s0 = new Singleton();  //Error
     Singleton s1 = Singleton.GetInstance();
     Singleton s2 = Singleton.GetInstance();
     if(s1==s2)
     {
       // Misma instancia
     }
   }
}

上面的代码实现了一个类,当实例化时(通过GetInstance()静态方法)返回该类的唯一实例。

答案 1 :(得分:1)

Session variable in WCF application

也许这会有所帮助,看看RandomNoob的答案。

答案 2 :(得分:0)

您可以将webServiceId打包在Singleton课程中。

public sealed class WebServiceSettings
{
    private static readonly WebServiceSettings instance=new WebServiceSettings();
    private static int webServiceId;

    static WebServiceSettings()
    {
         webServiceId = //set webServiceId
    }

    private WebServiceSettings(){}

    public static WebServiceSettings Current
    {
        get
        {
            return instance;
        }
    }

    public int WebServiceId {get{return webServiceId;}}
}

然后您可以调用Id:

WebServiceSettings.Current.WebServiceId;

这个类基本上确保它只构造一次(在C#中,静态构造函数被保证被调用一次)。因此,填充WebServiceId的构造函数中的代码只会运行一次。