Global.asax.cs и статическая переменная - PullRequest
6 голосов
/ 26 мая 2011

В службе WCF мне нужно создать переменную, которая должна быть доступна в любое время из любого места. Все методы моего сервиса должны иметь доступ к этим данным, и я могу загрузить их только один раз. Поэтому я подумал об использовании статической переменной в Global.asax.cs. Однако я не уверен, что пойму, что станет областью действия этой переменной. Эти данные будут использоваться для всех запросов? Насколько я понимаю, так и должно быть, потому что в домене приложения должна использоваться одна и та же статическая переменная Это правильно?

public static IList<MyData> Data { get; set; } 
private static IList<MyData> Load() 
{
    return Big data struct from DB.
}

protected void Application_Start(object sender, EventArgs e)
{
    Data = Load();
}

Наконец, есть ли лучший способ добиться этого? Я не большой поклонник статических переменных ...

Ответы [ 3 ]

5 голосов
/ 26 мая 2011

Вы можете использовать переменную приложения:

public static IList<MyData> Data {
    get
    {
        if (Application["MyIListData"] != null)
            return (IList<MyData>)Application["MyIListData"];
        else
            return new IList<MyData>();
    }
    set
    {
        Application["MyIListData"] = value;    
    }
} 

protected void Application_Start(object sender, EventArgs e)
{
    Data = Load();
}

Не очень сильно отличается в реальной реализации, за исключением того, что теперь она доступна глобально через это имя переменной в качестве переменной приложения.

0 голосов
/ 26 мая 2011

Я бы использовал шаблон Singleton для хранения вашей переменной приложения. Он статичен, будет выделен после первого использования и доступен на весь срок службы вашего приложения. Я также думаю, что это намного лучше, чем использовать нетипизированное приложение типа HashTable. Для меня хранилище приложений является пережитком ASP и больше не используется в объектно-ориентированном мире.

Будьте осторожны, статическая переменная инициализируется только один раз, потому что каждый веб-запрос / вызов службы выполняется в своем собственном потоке.

Таким образом, вы можете загрузить данные при первом использовании и получить к ним доступ из любого места с помощью MyData.Data:

.
public class MyData
{
    private static IList<MyData> _data { get; set; } 

    public static IList<MyData> Data 
    {    
        get
        {
            if (_data == null)
               _data = load Big data struct from DB.
            return _data;
        }
    }
}

Событие лучше было бы инициализировать в статическом конструкторе, потому что тогда вызов был бы потокобезопасным.

0 голосов
/ 26 мая 2011

Да, статическая переменная действительна / видима для всех потоков / сеансов в вашем приложении .

AFAIK, статические переменные не являются общими для Домены приложений .Для выполнения этой задачи вы можете взглянуть на этот пример .

Вам не нужна переменная global , но вы хотите что-то, что доступно любому и везде,ты видишь противоречие?Любой вид singleton является просто глобальной переменной.Но в вашем случае это кажется лучшим решением.Вы просто должны убедиться, что ваш глобальный объект неизменен и поточно-ориентирован .

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