/// <inheritdoc />
        public void StoreSession(IDatabase database, ISession session)
        {
            Fail.IfArgumentNull(database, nameof(database));
            Fail.IfArgumentNull(session, nameof(session));

            SessionsContainer container = this.GetSessionsContainer();

            container.StoreSession(database, session);
        }
        /// <inheritdoc />
        public IStatelessSession GetStatelessSession(IDatabase database)
        {
            Fail.IfArgumentNull(database, nameof(database));

            SessionsContainer container = this.GetSessionsContainer();
            var session = container.GetStatelessSession(database);

            return(session);
        }
        private SessionsContainer GetSessionsContainer()
        {
            IContextSorage <SessionsContainer> storage = this.GetContextStorage();
            SessionsContainer container = storage.Get();

            if (container == null)
            {
                container = new SessionsContainer();
                storage.Store(container);
            }

            return(container);
        }
        /// <inheritdoc />
        public ISession GetSession(IDatabase database)
        {
            Fail.IfArgumentNull(database, nameof(database));

            SessionsContainer container = this.GetSessionsContainer();
            ISession          session   = container.GetSession(database);

            if (session != null && session.IsOpen == false)
            {
                // Session is closed so lets remove it and return null
                container.RemoveSession(session);
                session = null;
            }
            return(session);
        }