อ่าน/เขียน ข้อมูลใน ASP.NET Session โดยใช้ Dynamic Objects

โดยปกติเมื่อเราต้องการ อ่าน/เขียน ข้อมูลใน session ของ ASP.NET เราจะทำผ่าน indexer บน object HttpSessionState

ตัวอย่าง อ่าน/เขียน session แบบเดิม:
Session[“CurrentUserId”] = 999;
int currentUserId = (int)Session[“CurrentUserId”];

แต่ใน namespace System.Dynamic ใหม่ของ .NET 4.0 เราสามารถสร้าง dynamic objects ที่มันสามารถเพิ่ม publice interface เข้าไปให้มันได้เลย โดยไม่ต้องเขียน code ประกาศไว้ก่อนเหมือนเขียน class ทั่วๆไป นั่นก็คือเราสามารถนำ dynamic objects มาใช้แทนการ อ่าน/เขียน ข้อมูลใน session แทน indexer ในแบบเดิมได้นั่นเอง

ตัวอย่างใน ASP.NET MVC ที่มีการประยุกต์ใช้ dynamic objects

ASP.NET MVC 1, 2 ใช้ ViewData[“Title”] = “Welcome to Dynamic Object”; แบบเดิมและ

ASP.NET MVC 3 เปลี่ยนไปเป็น ViewBag.Title= “Welcome to Dynamic Object”; ในแบบ dynamic objects

ดังนั้นผมจะทำให้ session ของผมใช้แบบ dynamic object บ้าง และข้างล่างนี้ก็คือ C# code เสร็จแล้วที่ อ่าน/เขียน session ในแบบ dynamic แนวคิดของ code ข้างล่างนี้ก็คือสร้าง class SessionBag ที่ทำหน้าที่เป็น wrapper ให้ HttpSessionState แล้วให้ SessionBag เป็นหรือสืบทอดจาก DynamicObject

using System.Dynamic;

public sealed class SessionBag : DynamicObject
{
    private static readonly SessionBag sessionBag;

    static SessionBag()
    {
        sessionBag = new SessionBag();
    }

    private SessionBag()
    {
    }

    private HttpSessionStateBase Session
    {
        get { return new HttpSessionStateWrapper(HttpContext.Current.Session); }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = Session[binder.Name];
        return true;
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        Session[binder.Name] = value;
        return true;
    }

    public override bool TryGetIndex(GetIndexBinder
           binder, object[] indexes, out object result)
    {
        int index = (int)indexes[0];
        result = Session[index];
        return result != null;
    }

    public override bool TrySetIndex(SetIndexBinder binder,
           object[] indexes, object value)
    {
        int index = (int)indexes[0];
        Session[index] = value;
        return true;
    }

    public static dynamic Current
    {
        get { return sessionBag; }
    }
}

ดังนั้นเมื่อเราใช้ SessionBag ที่เป็น Dynamic Objects ใช้อ่าน/เขียน session แล้วจาก code แบบเดิมก็จะกลายเป็น

SessionBag.Current.UserId = 999;
int currentUserId = SessionBag.Current.UserId;

ขอขอบคุณ code ดีๆจาก: Accessing ASP.NET Session Data Using Dynamics

ขอบคุณครับ 🙂

 ถ้า คุณเป็นผู้นำตนเองได้ คุณก็จะเป็นผู้นำคนอื่นได้

แต่ถ้า คุณเป็นผู้นำใจตนเองได้ คุณก็จะเป็นผู้นำใจคนอื่นได้

— Chav.P —

Advertisements

#asp-net