2012-03-03 3 views
2

Как я могу совместно использовать глобальные данные уровня приложения на уровне приложений между всеми объектами, проживающими в приложении. Я думаю с точки зрения зарегистрированной записи пользователя, которая была открыта для работы пользователем для сеанса и т. Д. Как я могу сделать эту информацию доступной для всех моих форм и классов, которые они используют для бизнес-логических служб?Как я могу поддерживать общее состояние в приложении Windows Forms таким образом, как Session в ASP.NET?

Просто один крупный глобальный объект AppContext для Singleton не привлекает меня, но я не могу придумать ничего другого прямо сейчас. Может быть, расширить класс Application, чтобы предложить контекстный сервис для всех форм? Я не работал над настольными приложениями в течение некоторого времени и пришел к выводу, например, когда-либо существующий объект Session в ASP.NET.

ответ

1

Я думаю, что концепция «сеанса» браузера была изобретена для поддержания состояния через запросы браузера. Это действительно не проблема для настольных приложений. Вы можете определить типизированный класс с информацией о пользователе: id, email, name и т. Д. В принципе, все, что вы храните в сеансе. Когда кто-то войдет в систему, создайте новый экземпляр и назначьте его статической переменной. Когда они выходят из системы, установите для статической переменной значение null.

Если вы хотите, чтобы он больше походил на HttpSessionState (произвольные пары ключ/значение), замените свой типизированный класс на Hashtable.

EDIT

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

public class AppContext 
{ 
    private static AppContext current; 

    // reference to the current app context 
    public static AppContext Current 
    { 
     get { return current; } 
    } 

    // prevents new instance from being created externally 
    private AppContext() { } 

    // call when a user logs in 
    public static void Login(AppUser user) 
    { 
     current = new AppContext() 
     { 
      ApppUser = user 
     }; 
    } 

    // call when a user logs out 
    public static void Logout() 
    { 
     current = null; 
    } 

    // reference to the logged in user 
    public AppUser User 
    { 
     get; 
     private set; 
    } 

    public String FooString 
    { 
     get; 
     set; 
    } 

    public int? FooInt 
    { 
     get; 
     set; 
    } 

    public ComplexType FooClass 
    { 
     get; 
     set; 
    } 

    public IList<Foo> ListOfFoo 
    { 
     get; 
     set; 
    } 

    // ***** DEFINE ADDTL PARAMETERS HERE AS NEEDED ***** 
} 

Из любой формы в вашем приложении вы можете легко ссылаться на AppContext.Current. Я не уверен, что это вполне отвечает на ваш вопрос, но это будет мой первый подход.

+0

В каком классе я определяю такую ​​статическую переменную, это мой главный вопрос здесь. – ProfK

0

Приложения сервера-клиента, такие как веб-сайты, должны иметь дело с обменом данными по сети, что связано с сериализацией и десериализацией и ключами для идентификации контекста пользователя (например, идентификатор сеанса, идентификатор клиента , и т.д).

В WinForms все объекты находятся в памяти и готовы к доступу в любой момент. Это просто и эффективно, и я бы не усложнил ситуацию, если меня не принуждают требования.

AppContext singleton кажется мне совершенно разумным, просто следите за проблемами безопасности потоков, если одновременно ударят несколько окон.

+0

Я понимаю различия, и да, я могу хранить объекты в памяти для потенциально очень долгого срока жизни приложений, но мои сомнения/вопросы возникают из того, где, а не как. Хорошо, так что, может быть, только один синглтон тогда, только один раз. :-) – ProfK