WinForm C中的Nhibernate会话#

时间:2017-05-10 07:32:18

标签: c# winforms session nhibernate mvp

我正处于winForm应用程序的中间,并且使用MVP作为架构 和NHIBERNATE为ORM

到目前为止所有事情都很好,但现在我想使用会话容器进行我的nh会话来存储和检索它们。 在webform我使用http请求存储主题没有问题,但在Winform我很困惑。 webform的cose是。

public class HttpSessionContainer : ISessionStorageContainer
{
    private string _sessionKey = "NhibernateSession";

    public ISession GetCurrentSession()
    {
        ISession nhSession = null;

        if (HttpContext.Current.Items.Contains(_sessionKey))
            nhSession = (ISession)HttpContext.Current.Items[_sessionKey];

        return nhSession;
    }

    public void Store(ISession session)
    {
        if (HttpContext.Current.Items.Contains(_sessionKey))
            HttpContext.Current.Items[_sessionKey] = session;
        else
            HttpContext.Current.Items.Add(_sessionKey, session);
    }
}

如何转换该代码,以便我可以存储每个表单的会话。 感谢

1 个答案:

答案 0 :(得分:0)

您可以使用静态类创建会话存储:

首先创建一个SessionStorageFactory:

public static class SessionStorageFactory
{
    public static Dictionary<string, ISessionStorageContainer> _nhSessionStorageContainer = new Dictionary<string, ISessionStorageContainer>();
    public static ISessionStorageContainer GetStorageContainer(string key)
    {
        ISessionStorageContainer storageContainer = _nhSessionStorageContainer.ContainsKey(key) ? _nhSessionStorageContainer[key] : null;
        if (storageContainer == null)
        {
            if (HttpContext.Current == null)
            {
                storageContainer = new ThreadSessionStorageContainer(key);
                _nhSessionStorageContainer.Add(key, storageContainer);
            }
            else
            {
                storageContainer = new HttpSessionContainer(key);
                _nhSessionStorageContainer.Add(key, storageContainer);
            }
        }
        return storageContainer;
    }
}

然后在你的GetCurrentSession上,你可以访问你的SesssionStorage:

public ISession GetCurrentSession
    {
        get
        {
            ISessionStorageContainer sessionStorageContainer = SessionStorageFactory.GetStorageContainer(ConnectionName + ".SessionKey");
            ISession currentSession = sessionStorageContainer.GetCurrentSession();
            if (currentSession == null)
            {
                currentSession = GetNewSession();
                sessionStorageContainer.Store(currentSession);
            }
            return currentSession;
        }
    }

private ISession GetNewSession()
    {
        return GetSessionFactory().OpenSession();
    }