Custom Interceptor দিয়ে Data Validation এবং Audit

NHibernate এর Event এবং Interceptor System - এন হাইবারনেট (NHibernate) - Microsoft Technologies

320

NHibernate এ Interceptor হল একটি পদ্ধতি যার মাধ্যমে আপনি data validation এবং audit ফিচারগুলোর জন্য কাস্টম লজিক ইনজেক্ট করতে পারেন। Interceptor ব্যবহার করে আপনি ডেটাবেস অপারেশনগুলোর আগে বা পরে কিছু কাস্টম লজিক প্রয়োগ করতে পারেন, যেমন ডেটা যাচাই করা (validation), লগিং বা অডিট ট্র্যাকিং করা।

এখানে, আমরা দেখব কিভাবে একটি Custom Interceptor তৈরি করে ডেটা ভ্যালিডেশন এবং অডিট ট্র্যাকিং করা যায়।


NHibernate Interceptor এর মৌলিক ধারণা

NHibernate Interceptor হল একটি callback যা বিভিন্ন পর্যায়ে ডেটাবেস অপারেশনগুলোর (যেমন save, update, delete) উপর কাস্টম লজিক প্রয়োগ করতে সাহায্য করে। NHibernate এর বিভিন্ন event এর সাথে Interceptor যুক্ত করতে পারেন, যেমন:

  • PreInsert: ইনসার্ট হওয়ার আগে।
  • PreUpdate: আপডেট হওয়ার আগে।
  • PreDelete: ডিলিট হওয়ার আগে।
  • OnLoad: লোড করার সময়।
  • PostInsert/PostUpdate/PostDelete: অপারেশন শেষে।

এগুলোকে ব্যবহার করে আপনি ভ্যালিডেশন, অডিটিং বা অন্যান্য কাস্টম কাজ সম্পাদন করতে পারেন।


Custom Interceptor তৈরি করা

আমরা প্রথমে একটি কাস্টম Interceptor তৈরি করব যেটি data validation এবং audit logging করবে।

1. Data Validation: ডেটার সঠিকতা যাচাই করা।

2. Audit: কে কখন কোনো ডেটা পরিবর্তন করেছে, সেটি ট্র্যাক করা।

3. Interceptor Implementation

using NHibernate;
using NHibernate.Event;
using System;

public class CustomNHibernateInterceptor : EmptyInterceptor
{
    public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        // Data Validation: নিশ্চিত করুন যে ডেটা সঠিক রয়েছে
        if (entity is Employee employee)
        {
            if (string.IsNullOrEmpty(employee.Name))
            {
                throw new InvalidOperationException("Employee name cannot be null or empty.");
            }
            if (employee.Age <= 0)
            {
                throw new InvalidOperationException("Employee age must be greater than 0.");
            }
        }

        // Audit: ইনসার্ট করার সময় লগিং
        Console.WriteLine($"[Audit] Inserting entity of type {entity.GetType().Name} at {DateTime.Now}");

        // Continue with the default behavior
        return base.OnSave(entity, id, state, propertyNames, types);
    }

    public override bool OnUpdate(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        // Data Validation: নিশ্চিত করুন যে আপডেটের ডেটা সঠিক
        if (entity is Employee employee)
        {
            if (employee.Age <= 0)
            {
                throw new InvalidOperationException("Employee age must be greater than 0.");
            }
        }

        // Audit: আপডেট করার সময় লগিং
        Console.WriteLine($"[Audit] Updating entity of type {entity.GetType().Name} at {DateTime.Now}");

        // Continue with the default behavior
        return base.OnUpdate(entity, id, currentState, previousState, propertyNames, types);
    }

    public override bool OnDelete(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        // Audit: ডিলিট করার সময় লগিং
        Console.WriteLine($"[Audit] Deleting entity of type {entity.GetType().Name} at {DateTime.Now}");

        // Continue with the default behavior
        return base.OnDelete(entity, id, state, propertyNames, types);
    }
}

এখানে:

  • OnSave: Employee ইনসার্ট হওয়ার আগে তার নাম এবং বয়স যাচাই করা হচ্ছে। যদি কোনো তথ্য ভুল থাকে, তাহলে একটি InvalidOperationException ছুঁড়ে দেয়া হচ্ছে।
  • OnUpdate: Employee আপডেট করার আগে তার বয়স যাচাই করা হচ্ছে।
  • OnDelete: ডিলিট করার সময় অডিট লগিং হচ্ছে।

Interceptor ব্যবহার করা

এখন, কাস্টম Interceptor তৈরি করার পর, আমরা এটি NHibernate সেশনে যুক্ত করব।

using NHibernate;
using NHibernate.Cfg;

public class NHibernateHelper
{
    private ISessionFactory sessionFactory;

    public NHibernateHelper()
    {
        // NHibernate Configuration
        var configuration = new Configuration();
        configuration.Configure();  // hibernate.cfg.xml ফাইল থেকে কনফিগারেশন লোড করা
        configuration.AddAssembly(typeof(Employee).Assembly); // অ্যাসেম্বলি অ্যাড করা

        // কাস্টম Interceptor যুক্ত করা
        sessionFactory = configuration.BuildSessionFactory();
    }

    public ISession OpenSession()
    {
        var session = sessionFactory.OpenSession();
        
        // Interceptor যোগ করা
        session.SessionInterceptor = new CustomNHibernateInterceptor();
        
        return session;
    }
}

এখানে:

  • sessionFactory.OpenSession() কলের মাধ্যমে একটি নতুন সেশন তৈরি করা হয়েছে।
  • CustomNHibernateInterceptor যোগ করা হয়েছে সেশনে যাতে OnSave, OnUpdate, OnDelete ইভেন্টগুলো কাস্টম লজিকের সাথে ট্র্যাক করা যায়।

Audit Logging Example

Audit logging সাধারণত টেবিলের ডেটার পরিবর্তনের তথ্য ট্র্যাক করতে ব্যবহৃত হয়, যেমন কে, কখন, কিভাবে ডেটা পরিবর্তন করেছে। NHibernate Interceptor ব্যবহার করে আপনি সহজেই এই তথ্য লগ করতে পারেন।

এছাড়া, আপনি একটি AuditLog টেবিলও তৈরি করতে পারেন যা প্রতিটি ডেটা পরিবর্তনের সময় লগ রাখবে:

public class AuditLog
{
    public virtual int Id { get; set; }
    public virtual string EntityName { get; set; }
    public virtual string Action { get; set; }
    public virtual string Username { get; set; }
    public virtual DateTime Timestamp { get; set; }
}

এখন, আপনি CustomNHibernateInterceptor এর মধ্যে এই AuditLog এর ডেটা সেভ করতে পারেন:

public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
    // Audit Log সেভ করা
    if (entity is Employee employee)
    {
        var audit = new AuditLog
        {
            EntityName = "Employee",
            Action = "Insert",
            Username = "admin", // এখানে আপনি ব্যবহারকারী নাম পেতে পারেন
            Timestamp = DateTime.Now
        };

        using (var session = _sessionFactory.OpenSession())
        {
            session.Save(audit);
        }
    }

    // Continue with the default behavior
    return base.OnSave(entity, id, state, propertyNames, types);
}

এখানে, AuditLog টেবিলটি সব ডেটাবেস অপারেশন (ইনসার্ট, আপডেট, ডিলিট) রেকর্ড করার জন্য ব্যবহার হবে।


উপসংহার

NHibernate Interceptors ব্যবহারের মাধ্যমে আপনি ডেটাবেস অপারেশনগুলোতে কাস্টম লজিক প্রয়োগ করতে পারেন। এটি বিশেষত Data Validation এবং Audit Logging এর জন্য খুবই কার্যকর। কাস্টম ইন্টারসেপ্টর ব্যবহার করে আপনি ডেটার সঠিকতা নিশ্চিত করতে পারবেন এবং অডিট ট্র্যাকিংয়ের মাধ্যমে ডেটাবেসের পরিবর্তনগুলো সঠিকভাবে লগ রাখতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...