Showing posts with label Session management in MVC.. Show all posts
Showing posts with label Session management in MVC.. Show all posts

Wednesday, April 8, 2020

Session management in MVC.

Session management in MVC.

Step 1. Create Class with Name 'AppCacheManager'  in class library.

using System;
using System.Web;

namespace DotNetByPriyanshu
{
    public class AppCacheManager
    {
        #region Instance Property

        // This approach ensures that only one instance is created and only when the instance is needed. 
        // Also, the variable is declared to be volatile to ensure that assignment to the instance variable 
        // completes before the instance variable can be accessed. 
        // Lastly, this approach uses a syncRoot instance to lock on, rather than locking on the type itself, to avoid deadlocks. 
        //
        // This double-check locking approach solves the thread concurrency problems while avoiding an exclusive lock 
        // in every call to the Instance property method. 
        // It also allows you to delay instantiation until the object is first accessed.
        // In practice, an application rarely requires this type of implementation. 
        // In most cases, the static initialization approach is sufficient.
        private static volatile AppCacheManager _Instance = null;
        private static object syncRoot = new Object();

        /// <summary>
        /// Get/Set a Thread-Safe Instance of the AppCacheManager class
        /// </summary>
        public static AppCacheManager Instance
        {
            get
            {
                if (_Instance == null)
                {
                    lock (syncRoot)
                    {
                        if (_Instance == null)
                        {
                            _Instance = new AppCacheManager();
                        }
                    }
                }

                return _Instance;
            }
            set { _Instance = value; }
        }
        #endregion

        #region
        /// <summary>
        /// Get a specific value from the user (HttpContext.Current.Session) cache.
        /// If the key is not found, a null value is returned.
        /// </summary>
        /// <param name="key">The unique key of the cached value to retrieve</param>
        /// <returns>The cached value or null if the key/value is not found</returns>
        public T GetFromUserCache<T>(string key)
        {
            T ret;
            object value;

            value = HttpContext.Current.Session[key];
            if (value != null)
            {
                ret = (T)value;
            }
            else
            {
                ret = default(T);
            }

            return ret;
        }

        /// <summary>
        /// Call this method to add a key/value pair to cache that is specific for a user of the application.
        /// The SessionID is used to uniquely identify the user.
        /// </summary>
        /// <param name="key">A unique key to identify the cached value</param>
        /// <param name="value">The value to add to the cache</param>
        public void AddToUserCache(string key, object value)
        {
            HttpContext.Current.Session.Add(key, value);
        }

        #endregion
    }
}

Step 2 . Create class with Name 'AppUserSession' in class library.


using System;

namespace DotNetByPriyanshu
{
    /// <summary>
    /// Provides strongly-typed access to session variables.
    /// </summary>
    [Serializable]
    public class AppUserSession
    {
        // Add your own Properties in the following region
        #region Public Properties

        /// <summary>
        /// Get/Set the Last Employee Name used
        /// NOTE: This is a sample only, you can remove this.
        /// </summary>
        public string Name
        {
            get { return AppCacheManager.Instance.GetFromUserCache<string>("Name"); }
            set { AppCacheManager.Instance.AddToUserCache("Name", value); }
        }
       
        /// <summary>
        /// Get/Set the UserId used
        /// </summary>
        public int UserId
        {
            get { return AppCacheManager.Instance.GetFromUserCache<int>("UserId"); }
            set { AppCacheManager.Instance.AddToUserCache("UserId", value); }
        }


        #endregion
    }
}


Step 3. Create class with Name 'AppController' and inherit Controller in class library.

using System.Web.Mvc;

namespace DotNetByPriyanshu
{
    public class AppController : Controller
    {
        #region Protected Properties
        private AppUserSession _session;

        /// <summary>
        /// Get/Set the User Session information on a page
        /// </summary>
        protected AppUserSession UserSession
        {
            get
            {
                if (_session == null)
                {
                    _session = new AppUserSession();
                }
                return _session;
            }
            set { _session = value; }
        }
        #endregion

        #region Init Method
        /// <summary>
        /// Initialize any items needed by all controllers
        /// </summary>
        public void Init()
        {

        }
        #endregion

        /// <summary>
        /// Get Logged-In User Full-Name
        /// </summary>
        /// <returns></returns>
        public string GetLoggedInUserFullName()
        {
            string value = string.Empty;
            if (UserSession.Name != null)
                return value = UserSession.Name;
            else
                return value = "unknown";
        }

    }
}


Use of Session in MVC application:-

create controller and inherit AppController .

example:-

using DotNetByPriyanshu;
using System;
using System.Collections.Generic;
using System.Data;
using System.Web.Mvc;

namespace DotNetByPriyanshuWebApp.Controllers.Employee
{
        private readonly IUserInfo _userInfo;
      
        public EmployeeController(IUserInfo userInfo)
        {
            _userInfo = userInfo;
        }

    public class EmployeeController : AppController // change controller in to AppController 
    {
       
        [HttpGet]
        public ActionResult EmployeeList()
        {
            try
            {
                  var objList =_userInfo.getUserDetailsByUserId(UserSession.UserId);
                  // Here I am using Session

                return View(objList);
            }
            catch (Exception ex)
            {
                throw;
            }
        }
      
    }
}