Альтернативы статическим переменным? - PullRequest
2 голосов
/ 22 июня 2010

В моем коде я использую статическое поле для хранения определенного значения.

public static int webServiceId;

Я удалил это и использую любое другое решение. Но значение следует сохранить после обратной передачи. Мы не можем использовать Session или ViewState здесь. Потому что я работаю со службами (в слое Service).

Пример:

Я получаю идентификатор веб-сервиса в следующем методе файла xyz.cs:

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

}

и затем управление переходит к другому методу другого файла класса (скажем, к файлу abd.cs). И предположим, что при вызове исключения метода он вызовет метод LogError (ошибка исключения) моего файла первого класса (xyz.cs). И когда элемент управления возвращается в наш файл классов (xyz.cs), нам нужно вернуть идентификатор веб-службы. Потому что мы используем это для хранения информации об исключениях в базе данных в соответствии с идентификатором веб-сервиса.

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 ]

1 голос
/ 22 июня 2010

Рассматривали ли вы внедрение 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 голос
/ 22 июня 2010

Переменная сеанса в приложении WCF

Может быть, это поможет, посмотрите ответ RandomNoob.

0 голосов
/ 22 июня 2010

Вы можете обернуть 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;}}
}

Затем вы можете позвонить по номеру:

WebServiceSettings.Current.WebServiceId;

Этот класс, по сути, гарантирует, что он создается только один раз (в C # статические конструкторы гарантированно будут вызываться один раз). Следовательно, код в конструкторе для заполнения WebServiceId будет выполняться только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...