NHibernate Interceptor হল একটি বিশেষ শ্রেণি যা NHibernate-এর ইভেন্টগুলিকে ধরা এবং প্রক্রিয়া করার জন্য ব্যবহৃত হয়। Change Tracking এমন একটি প্রক্রিয়া যেখানে আপনি ডেটার পরিবর্তনগুলি ট্র্যাক করতে পারেন, যেমন একটি অবজেক্টের স্টেট পরিবর্তন হয়েছে কিনা, তা কীভাবে বা কখন হয়েছে ইত্যাদি।
এটি সাধারণত লগিং, অডিটিং, এবং সিকিউরিটি চেক করার জন্য ব্যবহৃত হয়। NHibernate Interceptor ব্যবহার করে আপনি অবজেক্টে হওয়া পরিবর্তনগুলো ধরা, অডিট করা বা কাস্টম লজিক প্রক্রিয়া করতে পারেন।
NHibernate Interceptor কী?
NHibernate Interceptor হল একটি ক্লাস যা NHibernate-এর বিভিন্ন লাইফসাইকেল ইভেন্টের মধ্যে হুক প্রদান করে। এটি বিভিন্ন কাস্টম ইভেন্ট (যেমন সেশন সেভ, সেশন আপডেট) ধরা এবং কাস্টম আচরণ প্রক্রিয়া করতে সক্ষম।
যখন NHibernate একটি অবজেক্ট লোড, সেভ বা আপডেট করে, তখন Interceptor এটি কাস্টম লজিক প্রয়োগ করতে সক্ষম করে।
Interceptor এর ব্যবহার
NHibernate Interceptor এর মাধ্যমে আপনি Change Tracking পরিচালনা করতে পারেন। এটি বিশেষভাবে উপকারী হতে পারে যখন আপনি কোনো অবজেক্টে পরিবর্তন ঘটলে তা সিস্টেমে ট্র্যাক করতে চান, যেমন অডিট লগ বা ডেটাবেসে পরিবর্তনগুলো রেকর্ড করা।
উদাহরণ হিসেবে:
ধরা যাক, আমাদের Employee ক্লাস রয়েছে, এবং আমরা তার পরিবর্তনগুলি ট্র্যাক করতে চাই। আমরা NHibernate Interceptor ব্যবহার করে সেই পরিবর্তনগুলো ট্র্যাক করব।
Interceptor তৈরি করা
এখানে একটি NHibernate Interceptor এর উদাহরণ দেওয়া হলো যা Employee অবজেক্টের পরিবর্তনগুলি ট্র্যাক করবে:
using NHibernate;
using NHibernate.Intercept;
using System;
public class ChangeTrackingInterceptor : EmptyInterceptor
{
public override void OnSave(object entity, object id, System.Type type)
{
if (entity is Employee)
{
Console.WriteLine($"Saving Employee: {((Employee)entity).Name}");
}
}
public override void OnUpdate(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
if (entity is Employee)
{
Console.WriteLine($"Updating Employee: {((Employee)entity).Name}");
}
}
public override void OnDelete(object entity, object id, System.Type type)
{
if (entity is Employee)
{
Console.WriteLine($"Deleting Employee: {((Employee)entity).Name}");
}
}
}
এখানে:
OnSave: যখন একটিEmployeeঅবজেক্ট সেভ হবে, এটি সেই অবজেক্টের নাম কনসোলে প্রিন্ট করবে।OnUpdate: যখন একটিEmployeeঅবজেক্ট আপডেট হবে, এটি সেই অবজেক্টের নাম কনসোলে প্রিন্ট করবে।OnDelete: যখন একটিEmployeeঅবজেক্ট ডিলিট হবে, এটি সেই অবজেক্টের নাম কনসোলে প্রিন্ট করবে।
এই Interceptor কাস্টম লগিং বা ট্র্যাকিং করতে ব্যবহৃত হবে। যেমন, আপনি পরিবর্তনগুলো ডাটাবেসের AuditLog টেবিলেও রেকর্ড করতে পারেন।
Interceptor কে সেশন-এ যুক্ত করা
এখন আমাদের তৈরি করা Interceptor কে NHibernate সেশনের সাথে যুক্ত করতে হবে যাতে এটি কার্যকর হয়। এটি করতে ISessionFactory এর মাধ্যমে Interceptor নির্ধারণ করা হয়।
public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
public static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
_sessionFactory = new Configuration().Configure()
.AddAssembly(typeof(Employee).Assembly)
.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
var session = SessionFactory.OpenSession();
session.Interceptor = new ChangeTrackingInterceptor(); // Interceptor যোগ করা
return session;
}
}
এখানে:
session.Interceptor = new ChangeTrackingInterceptor(): এটি আমাদের তৈরি করাChangeTrackingInterceptorকে সেশন-এ অ্যাসাইন করছে। এর ফলে, যখনই সেশন কোনো অবজেক্ট সেভ, আপডেট বা ডিলিট করবে, তখন Interceptor এর মাধ্যমে ট্র্যাক হবে।
Change Tracking উদাহরণ
এখন আমরা সেশন খুলে একটি Employee অবজেক্ট সেভ, আপডেট এবং ডিলিট করব, এবং সেগুলোর পরিবর্তনগুলোর ট্র্যাকিং হবে:
public class Program
{
public static void Main(string[] args)
{
// NHibernate সেশন খুলুন
using (var session = NHibernateHelper.OpenSession())
using (var transaction = session.BeginTransaction())
{
// নতুন Employee অবজেক্ট তৈরি
var employee = new Employee { Name = "John Doe", Age = 30 };
// Employee সেভ করা
session.Save(employee);
// Employee আপডেট করা
employee.Age = 31;
session.Update(employee);
// Employee ডিলিট করা
session.Delete(employee);
transaction.Commit();
}
}
}
এখানে:
- যখন
employeeঅবজেক্ট সেভ, আপডেট এবং ডিলিট হবে, Interceptor দ্বারা প্রতিটি পরিবর্তন কনসোলে প্রিন্ট হবে। - Output হবে:
Saving Employee: John DoeUpdating Employee: John DoeDeleting Employee: John Doe
অডিটিং এবং লগিং
এটি ব্যবহৃত হতে পারে ডেটা অডিটিং বা লগিংয়ের জন্য। উদাহরণস্বরূপ, আপনি যখন কোনো অবজেক্ট সেভ, আপডেট বা ডিলিট করবেন, তখন সেই পরিবর্তনের তথ্য AuditLog টেবিলে সঞ্চিত করা যেতে পারে।
public class AuditLogInterceptor : EmptyInterceptor
{
public override void OnSave(object entity, object id, System.Type type)
{
if (entity is Employee)
{
var auditLog = new AuditLog
{
EntityName = "Employee",
Action = "Save",
EntityId = id.ToString(),
Timestamp = DateTime.UtcNow
};
// Save to audit log table (Assuming AuditLog table exists)
SaveAuditLog(auditLog);
}
}
public override void OnUpdate(object entity, object id, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
{
if (entity is Employee)
{
var auditLog = new AuditLog
{
EntityName = "Employee",
Action = "Update",
EntityId = id.ToString(),
Timestamp = DateTime.UtcNow
};
// Save to audit log table
SaveAuditLog(auditLog);
}
}
public override void OnDelete(object entity, object id, System.Type type)
{
if (entity is Employee)
{
var auditLog = new AuditLog
{
EntityName = "Employee",
Action = "Delete",
EntityId = id.ToString(),
Timestamp = DateTime.UtcNow
};
// Save to audit log table
SaveAuditLog(auditLog);
}
}
private void SaveAuditLog(AuditLog log)
{
// Save log to AuditLog table
}
}
সারাংশ
- NHibernate Interceptor একটি শক্তিশালী টুল যা আপনি ডেটা সেভ, আপডেট বা ডিলিট করার সময় কাস্টম লজিক প্রয়োগ করতে ব্যবহার করতে পারেন।
- Change Tracking এর মাধ্যমে আপনি অবজেক্টের পরিবর্তনগুলি ট্র্যাক করতে পারেন।
- Interceptor ব্যবহার করে আপনি অডিটিং, লগিং, বা অন্য কোনো কাস্টম আচরণ প্রক্রিয়া করতে পারবেন।
Read more