2011-02-08 4 views
0

В основном я пытаюсь создать класс SessionManager, который я могу использовать для управления сеансами в моих приложениях MVC. Для этого я думаю, что лучший способ сделать это - создать класс-оболочку для HttpContext, который затем позволит мне получить доступ к HttpContext.Current.Session.Создание Wrapper для HttpContext

Если честно, я не уверен в этом, я просто чувствую, что это логичный способ сделать это. Я также хочу создать интерфейсы ISessionManager и ISession, а затем реализовать их в соответствии с потребностями моего приложения. Для моего текущего проекта, и на данный момент мне нужно управление сеансом InProc, но мне может потребоваться хранить данные сеанса на сервере MSSQL, когда мы решили расширить и использовать веб-ферму или сад. Вот почему я с самого начала пытаюсь создать своего рода расширяемую структуру.

Заключительное примечание. Я буду использовать Microsoft Unity для ввода конкретного SessionManager. Я считаю, что это хороший способ поддерживать определенный уровень абстракции.

Любые предложения по достижению всего этого?

Заранее благодарен! :)

+1

Не пишите «может быть код» (может быть, нам это понадобится, может быть, нам это понадобится). Вы всегда тратите время, затрачиваемое на функции или улучшения, которые могут принести пользу вашим пользователям сейчас, а не позже. – jfar

+0

Как вы будете реализовывать 'ISession' на' HttpContext.Current.Session', который является частью структуры? –

+0

@jfar: То, что вы сказали, имеет смысл. Но вы, возможно, неправильно поняли, что я сказал. Я хочу, чтобы мой код расширялся, но это не значит, что я буду кодировать диспетчер сеансов для каждого сценария ** сейчас **. Но я просто стараюсь держать все как абстрактное и расширяемое, насколько это возможно, поэтому мне не пришлось бы повторно создавать все позже. – Kassem

ответ

0

Хорошо, вот что я придумал, но я не уверен, что это правильный способ сделать это, чтобы ваши мнения были наиболее желанными!

ISessionManager:

public interface ISessionManager 
{  
    void RegisterSession(string key, object obj);  
    void FreeSession(string key); 
} 

SessionManager:

public class SessionManager : ISessionManager 
{ 
    private IDictionary<string, object> sessionDictionary; 

    public SessionManager(IDictionary<string, object> _sessionDictionary) 
    { 
     sessionDictionary = _sessionDictionary; 
    } 

    public IDictionary<string, object> Session 
    { 
     get 
     { 
      return sessionDictionary; 
     } 
    } 

    public void RegisterSession(string key, object obj) 
    { 
     sessionDictionary[key] = obj; 
    } 

    public void FreeSession(string key) 
    { 
     sessionDictionary[key] = null; 
    } 
} 

Затем, когда я хочу, чтобы создать экземпляр класса (в моем веб-приложение), я хотел бы сделать что-то вроде этого:

var sessionManager = new SessionManager(HttpContext.Current.Session); 
sessionManager.RegisterSession["myKey"] = someObject; 

Но я бы предпочел не использовать магические строки в качестве ключа. Я мог бы включить в класс константное строковое свойство, такое как sessionKey = "myKey", но это означало бы, что я мог хранить только один объект в диспетчере сеансов, верно?

Обратите внимание, пожалуйста. :)