Microsoft Technologies NHibernate এর Event এবং Interceptor System গাইড ও নোট

381

NHibernate এর Event এবং Interceptor System হল এমন শক্তিশালী বৈশিষ্ট্য, যা আপনাকে NHibernate কার্যপ্রণালীতে হুক তৈরি করতে এবং ইভেন্টগুলি হ্যান্ডল করতে সাহায্য করে। এই সিস্টেমগুলি আপনাকে বিভিন্ন ধরণের আচরণ কাস্টমাইজ করার সুযোগ দেয়, যেমন সেশন এবং ট্রানজেকশন ম্যানেজমেন্ট, অবজেক্ট লোড এবং সেভ অপারেশন, এবং অন্যান্য অনেক কাস্টম আচরণ।

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


1. NHibernate Event System

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

NHibernate কিছু প্রাথমিক ইভেন্ট প্রদান করে, যেমন:

  • Save event: যখন একটি অবজেক্ট সেভ হয়।
  • Update event: যখন একটি অবজেক্ট আপডেট হয়।
  • Delete event: যখন একটি অবজেক্ট ডিলিট হয়।
  • Load event: যখন একটি অবজেক্ট লোড হয়।
  • Flush event: যখন সেশন ফ্লাশ হয়।

এই ইভেন্টগুলির জন্য হ্যান্ডলার তৈরি করে আপনি প্রতিটি ইভেন্টের সময় অতিরিক্ত কাজ বা লজিক পরিচালনা করতে পারেন।

Event Listener তৈরি করা

এটি করার জন্য, আপনাকে প্রথমে একটি ক্লাস তৈরি করতে হবে যা নির্দিষ্ট ইভেন্টের জন্য লিসেনার হবে:

public class CustomSaveEventListener : ISaveEventListener
{
    public void OnSave(SaveEvent evt)
    {
        // সেভ অপারেশনের আগে আপনার কাস্টম লজিক বা কাজ এখানে করতে পারেন।
        Console.WriteLine("Saving entity: " + evt.Entity);
    }
}

এখানে, CustomSaveEventListener ক্লাসটি SaveEvent এর জন্য কাস্টম লজিক সংজ্ঞায়িত করেছে।

Event Listener কনফিগারেশন

এখন, আপনাকে আপনার NHibernate কনফিগারেশন ফাইলে এই ইভেন্ট লিসেনারটি নিবন্ধন করতে হবে:

var cfg = new Configuration();
cfg.EventListeners.SaveEventListeners = new ISaveEventListener[] { new CustomSaveEventListener() };

এইভাবে, আপনি NHibernate এর ইভেন্ট সিস্টেমে কাস্টম ইভেন্ট হ্যান্ডলার যোগ করতে পারেন।


2. NHibernate Interceptor System

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

Interceptor এর মৌলিক কার্যপ্রণালী

Interceptor এর মাধ্যমে আপনি অবজেক্টের উপর কাস্টম লজিক প্রয়োগ করতে পারেন যখন NHibernate কোনও কাজ সম্পাদন করছে। উদাহরণস্বরূপ, Save, Update, Delete ইত্যাদি কাজের আগে বা পরে কাস্টম লজিক প্রয়োগ করা।

Interceptor ক্লাস তৈরি করার উদাহরণ:

public class CustomInterceptor : EmptyInterceptor
{
    public override bool OnSave(object entity, object id, string[] propertyNames, object[] currentState, 
                                string[] previousState, object owner)
    {
        // সেভ অপারেশন চলার আগে কিছু কাস্টম লজিক করতে পারেন।
        if (entity is Customer customer)
        {
            Console.WriteLine("Saving customer: " + customer.Name);
        }

        return base.OnSave(entity, id, propertyNames, currentState, previousState, owner);
    }

    public override bool OnFlushDirty(object entity, object id, string[] propertyNames, 
                                      object[] currentState, object[] previousState, 
                                      string[] types)
    {
        // ডেটা আপডেট হওয়া অবস্থায় কিছু কাস্টম লজিক প্রয়োগ করতে পারেন।
        return base.OnFlushDirty(entity, id, propertyNames, currentState, previousState, types);
    }
}

এখানে, CustomInterceptor ক্লাসটি OnSave এবং OnFlushDirty মেথডগুলোর মাধ্যমে সেভ এবং আপডেট অপারেশনের সময় কিছু কাস্টম কার্যক্রম কার্যকর করবে।

Interceptor কনফিগারেশন

এখন, NHibernate কনফিগারেশন ফাইলে Interceptor সেটআপ করা হবে:

var cfg = new Configuration();
cfg.SetInterceptor(new CustomInterceptor()); // Interceptor নিবন্ধন করা হচ্ছে

এটি সমস্ত সেশন এবং ট্রানজেকশনের জন্য Interceptor ব্যবহৃত করবে।


3. Event এবং Interceptor এর পার্থক্য

  • Event System: ইভেন্ট সিস্টেম মূলত নির্দিষ্ট ইভেন্টের সময় কাস্টম লজিক চালানোর জন্য ব্যবহৃত হয়, যেমন SaveEvent, UpdateEvent, বা DeleteEvent। এটি মূলত নির্দিষ্ট কার্যপ্রণালী বা ক্রিয়াকলাপের জন্য হুক ব্যবহার করে।
  • Interceptor System: ইন্টারসেপ্টর সিস্টেম আরও বেশি বিস্তৃত এবং এটি প্রত্যেকটি সেশন বা ট্রানজেকশনের জন্য কাস্টম লজিক চালানোর সুযোগ দেয়। এটি শুধুমাত্র একক কার্যপ্রণালীর সময় নয়, বরং সমস্ত সেশন এবং ট্রানজেকশনের প্রসেসে হুক করতে পারে।

4. Event এবং Interceptor এর ব্যবহারিক সুবিধা

  • Event System:
    • নির্দিষ্ট সঞ্চালনগুলির সাথে যুক্ত কাস্টম লজিক প্রয়োগ করতে সহায়ক।
    • সহজে এবং নির্দিষ্ট কাস্টম কার্যপ্রণালী হ্যান্ডলিং।
    • ডেটাবেসের সঙ্গে ইন্টারঅ্যাকশনের সময় আচরণ কাস্টমাইজ করা সহজ।
  • Interceptor System:
    • সেশন স্তরের সকল ইভেন্টে কাস্টম লজিক প্রয়োগ করা।
    • ডেটাবেসের যে কোনও অপারেশন, যেমন সেভ, লোড, আপডেট, বা ডিলিটের সময় কাস্টম কাজ করা।
    • আরও উচ্চতর নিয়ন্ত্রণ প্রদান করে, যেখানে আপনি NHibernate সিস্টেমের অভ্যন্তরীণ কার্যপ্রণালী সম্পূর্ণ কাস্টমাইজ করতে পারেন।

NHibernate Event এবং Interceptor System আপনাকে ডেটাবেস অপারেশন এবং সেশন ম্যানেজমেন্টের উপর গভীর নিয়ন্ত্রণ এবং কাস্টমাইজেশন করতে সক্ষম করে। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের কার্যকারিতা, অডিটিং, লগিং, এবং অন্যান্য প্রয়োজনীয় লজিক প্রয়োগ করতে পারেন, যা আপনার প্রোজেক্টের পারফরম্যান্স এবং রক্ষণাবেক্ষণ সক্ষমতা উন্নত করবে।

Content added By

NHibernate Event System এর পরিচিতি

287

NHibernate এর Event System একটি শক্তিশালী বৈশিষ্ট্য যা ডোমেইন অবজেক্টের উপর নির্দিষ্ট কার্যক্রম (events) সঞ্চালিত হতে সাহায্য করে। এর মাধ্যমে আপনি কিছু নির্দিষ্ট কার্যক্রম বা অপারেশন সম্পাদন করার পূর্বে বা পরে নিজস্ব কোড কার্যকরী করতে পারেন, যেমন অবজেক্ট সেভ (save), আপডেট (update), ডিলিট (delete) বা লোড (load) করা। এটি মূলত ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করার সময় আরও কাস্টম লজিক ইনজেক্ট করার সুযোগ দেয়।

Event System কীভাবে কাজ করে?

NHibernate Event System এর মাধ্যমে আপনি ইভেন্টগুলিকে হুক করতে পারেন, যেগুলি নির্দিষ্ট অবস্থা বা অপারেশনের সময় কার্যকর হয়। ইভেন্টগুলো সাধারণত ট্রান্সাকশনাল অপারেশনের সাথে সম্পর্কিত হয়, যেমন:

  • Pre-Insert: অবজেক্টটি ডেটাবেসে ইনসার্ট করার আগে।
  • Post-Insert: অবজেক্টটি ডেটাবেসে ইনসার্ট হওয়ার পরে।
  • Pre-Update: অবজেক্টটি আপডেট হওয়ার আগে।
  • Post-Update: অবজেক্টটি আপডেট হওয়ার পরে।
  • Pre-Delete: অবজেক্টটি ডিলিট হওয়ার আগে।
  • Post-Delete: অবজেক্টটি ডিলিট হওয়ার পরে।
  • Load: অবজেক্ট লোড করার সময়।

এছাড়া, Flush এবং Persist ইভেন্টগুলোও সমর্থিত।


1. Event Listener এবং Event Handler

NHibernate এর ইভেন্ট সিস্টেমে মূলত দুটি উপাদান ব্যবহৃত হয়:

  • Event Listener: এটি একটি ক্লাস যা ইভেন্ট হ্যান্ডলিংয়ের জন্য তৈরি করা হয়। আপনি যেকোনো নির্দিষ্ট ইভেন্টের জন্য একটি লিসেনার তৈরি করতে পারেন।
  • Event Handler: এটি নির্দিষ্ট ইভেন্টকে প্রক্রিয়া করতে সহায়তা করে। যখন নির্দিষ্ট ইভেন্ট ঘটে, তখন হ্যান্ডলার সেই ইভেন্টটিকে প্রক্রিয়া করবে।

2. Event Types

NHibernate অনেক ধরনের ইভেন্ট প্রদান করে, যা বিভিন্ন সময় ও অবস্থায় কার্যকর হতে পারে। প্রধান ইভেন্ট টাইপগুলো হলো:

Pre-Insert

এটি তখন ঘটে যখন একটি অবজেক্ট ডেটাবেসে সেভ করা হবে, কিন্তু সেভ হওয়ার আগেই আপনি কিছু কাস্টম লজিক প্রয়োগ করতে পারেন।

public class MyEntityListener : IPreInsertEventListener
{
    public void OnPreInsert(PreInsertEvent e)
    {
        // কিছু কাস্টম লজিক এখানে যুক্ত করা যাবে
    }
}

Post-Insert

এটি তখন ঘটে যখন একটি অবজেক্ট ডেটাবেসে সফলভাবে সেভ হয়ে যাবে।

public class MyEntityListener : IPostInsertEventListener
{
    public void OnPostInsert(PostInsertEvent e)
    {
        // সেভ হওয়ার পর কিছু কার্যক্রম পরিচালনা
    }
}

Pre-Update

এটি তখন ঘটে যখন অবজেক্টটি আপডেট করার পূর্বে কাস্টম লজিক প্রয়োগ করতে চান।

public class MyEntityListener : IPreUpdateEventListener
{
    public void OnPreUpdate(PreUpdateEvent e)
    {
        // আপডেট হওয়ার আগে কিছু কাস্টম কার্যক্রম
    }
}

Post-Update

এটি তখন ঘটে যখন অবজেক্টটি সফলভাবে আপডেট হয়।

public class MyEntityListener : IPostUpdateEventListener
{
    public void OnPostUpdate(PostUpdateEvent e)
    {
        // আপডেট হওয়ার পর কার্যক্রম
    }
}

Pre-Delete

এটি তখন ঘটে যখন অবজেক্টটি ডিলিট করার আগে।

public class MyEntityListener : IPreDeleteEventListener
{
    public void OnPreDelete(PreDeleteEvent e)
    {
        // ডিলিট হওয়ার আগে কিছু কাস্টম কার্যক্রম
    }
}

Post-Delete

এটি তখন ঘটে যখন অবজেক্টটি সফলভাবে ডিলিট হয়।

public class MyEntityListener : IPostDeleteEventListener
{
    public void OnPostDelete(PostDeleteEvent e)
    {
        // ডিলিট হওয়ার পর কার্যক্রম
    }
}

Load

এটি তখন ঘটে যখন অবজেক্টটি ডেটাবেস থেকে লোড হয়।

public class MyEntityListener : ILoadEventListener
{
    public void OnLoad(LoadEvent e)
    {
        // লোড হওয়ার পর কিছু কার্যক্রম
    }
}

3. ইভেন্ট লিসেনার রেজিস্টার করা

একবার আপনি ইভেন্ট হ্যান্ডলার তৈরি করলে, আপনাকে সেগুলি NHibernate কনফিগারেশন ফাইলে বা কোডে রেজিস্টার করতে হবে।

কনফিগারেশনে ইভেন্ট লিসেনার রেজিস্টার করা

var cfg = new Configuration();
cfg.Configure(); // Default configuration
cfg.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { new MyEntityListener() };
cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new MyEntityListener() };
// অন্যান্য ইভেন্ট লিসেনার রেজিস্টার করুন

এভাবে আপনি বিভিন্ন ইভেন্টের জন্য হ্যান্ডলারের ইনস্ট্যান্স রেজিস্টার করতে পারেন।

Fluent NHibernate ব্যবহার করে ইভেন্ট রেজিস্টার

Fluent NHibernate ব্যবহার করেও ইভেন্ট লিসেনার রেজিস্টার করা যায়:

FluentConfiguration fcfg = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString("your_connection_string"))
    .ExposeConfiguration(cfg =>
    {
        cfg.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { new MyEntityListener() };
        cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new MyEntityListener() };
        // অন্যান্য ইভেন্ট লিসেনার রেজিস্টার করুন
    })
    .BuildSessionFactory();

4. কাস্টম ইভেন্ট লিসেনারের সুবিধা

NHibernate Event System এর মাধ্যমে আপনি নিম্নলিখিত সুবিধা পেতে পারেন:

  • Audit Logs: ডেটাবেসে সেভ, আপডেট, বা ডিলিট অপারেশনের সময় অডিট লগ রাখা।
  • Validation: অবজেক্ট সেভ বা আপডেট হওয়ার আগে কাস্টম ভ্যালিডেশন করা।
  • Security Checks: ডেটাবেসে কোনো ডিলিট বা আপডেট করার আগে নিরাপত্তা চেক করা।
  • Triggering Other Actions: এক অপারেশনের পর অন্য কোনো কার্যক্রম চালানো (যেমন: ক্যাশে আপডেট, ইমেইল পাঠানো, ইত্যাদি)।

সারাংশ

NHibernate Event System আপনাকে আপনার ডোমেইন মডেল এবং ডেটাবেস অপারেশনের মধ্যে কাস্টম লজিক প্রয়োগ করতে সহায়তা করে। এর মাধ্যমে আপনি সেভ, আপডেট, ডিলিট, এবং লোড ইভেন্টের সময় নির্দিষ্ট কাজ করতে পারবেন, যা ডেটাবেস অপারেশনের আরও নিয়ন্ত্রণ এবং কর্মক্ষমতা নিশ্চিত করে।

Content added By

Pre-Insert, Post-Insert Event ব্যবহার

305

NHibernate-এ Pre-Insert এবং Post-Insert ইভেন্টগুলি হল সেই ইভেন্টস যা একটি অবজেক্ট ডেটাবেসে ইনসার্ট করার আগে এবং পরে ট্রিগার হয়। এই ইভেন্টগুলো ব্যবহার করে আপনি কিছু অতিরিক্ত লজিক প্রয়োগ করতে পারেন, যেমন ডেটা পরিবর্তন করা, লগিং করা, বা সিস্টেমে কোনও নির্দিষ্ট কাজ সম্পাদন করা।


1. Pre-Insert Event

Pre-Insert ইভেন্টটি একটি অবজেক্ট যখন ডেটাবেসে ইনসার্ট করার জন্য প্রস্তুত হয়, তখন ট্রিগার হয়। এটি ডেটাবেসে ইনসার্ট করার আগে কিছু অতিরিক্ত কাজ করার সুযোগ দেয়। উদাহরণস্বরূপ, আপনি ডেটাবেসে কিছু মান ইনসার্ট করার আগে ডেটার বৈধতা পরীক্ষা বা ডিফল্ট মান সেট করতে পারেন।

Pre-Insert ইভেন্ট ব্যবহার

PreInsertEvent-এ আপনার অবজেক্টে কিছু পরিবর্তন করতে বা অতিরিক্ত কাজ সম্পাদন করতে পারেন।

উদাহরণস্বরূপ:

using NHibernate.Event;

public class MyPreInsertEventListener : IPreInsertEventListener
{
    public bool OnPreInsert(PreInsertEvent @event)
    {
        var entity = @event.Entity as Employee;
        if (entity != null)
        {
            // ডেটাবেসে ইনসার্ট করার আগে অতিরিক্ত কাজ করতে পারেন
            if (string.IsNullOrEmpty(entity.CreatedDate))
            {
                entity.CreatedDate = DateTime.Now.ToString();  // ডিফল্ট মান সেট করা
            }
        }
        return false;  // true হলে প্রক্রিয়া থামবে, false মানে ইভেন্ট চালু থাকবে
    }
}

এখানে, OnPreInsert মেথডটি Employee অবজেক্টে CreatedDate প্রপার্টির ডিফল্ট মান সেট করছে। PreInsertEvent তে কোনো পরিবর্তন করলে, এটি ডেটাবেসে ইনসার্ট হওয়ার আগেই প্রক্রিয়া সম্পন্ন হবে।

NHibernate-এ Pre-Insert ইভেন্ট রেজিস্টার করা

var configuration = new Configuration();
configuration.SetListener(ListenerType.PreInsert, new MyPreInsertEventListener());

এভাবে, আপনি আপনার ইভেন্ট লিস্টেনারকে NHibernate কনফিগারেশনের সাথে সংযুক্ত করে রাখতে পারেন।


2. Post-Insert Event

Post-Insert ইভেন্টটি ডেটাবেসে ইনসার্ট হওয়ার পরে ট্রিগার হয়। এই ইভেন্টটি সাধারণত লগিং, বা অন্যান্য সিস্টেমে তথ্য আপডেট করার জন্য ব্যবহৃত হয়। একবার যখন ইনসার্ট অপারেশন সফলভাবে সম্পন্ন হয়ে যায়, তখন এই ইভেন্টটি ব্যবহৃত হতে পারে।

Post-Insert ইভেন্ট ব্যবহার

PostInsertEventListener এর মাধ্যমে আপনি ইনসার্টের পরে কিছু অতিরিক্ত কার্যকলাপ পরিচালনা করতে পারেন, যেমন অন্য টেবিল আপডেট বা মেসেজ পাঠানো।

using NHibernate.Event;

public class MyPostInsertEventListener : IPostInsertEventListener
{
    public void OnPostInsert(PostInsertEvent @event)
    {
        var entity = @event.Entity as Employee;
        if (entity != null)
        {
            // ইনসার্ট করার পর অতিরিক্ত কাজ করতে পারেন
            Console.WriteLine("Employee with ID: " + entity.Id + " has been inserted.");
            // এখানে আপনি লগিং বা অন্য কোন কাজ করতে পারেন
        }
    }
}

এখানে, OnPostInsert মেথডটি ডেটাবেসে ইনসার্ট হওয়ার পরে ট্রিগার হবে এবং সফল ইনসার্ট হওয়ার পর একটি বার্তা কনসোলে প্রদর্শন করবে।

NHibernate-এ Post-Insert ইভেন্ট রেজিস্টার করা

var configuration = new Configuration();
configuration.SetListener(ListenerType.PostInsert, new MyPostInsertEventListener());

এভাবে, PostInsert ইভেন্ট লিস্টেনারকে NHibernate কনফিগারেশনে রেজিস্টার করা যাবে।


3. Pre-Insert এবং Post-Insert এর ব্যবহারের ক্ষেত্র

Pre-Insert:

  • ডেটার বৈধতা পরীক্ষা: ইনসার্ট করার আগে কিছু ফিল্ডের মান পরীক্ষা করা বা সেট করা।
  • ডিফল্ট মান নির্ধারণ: কোনো মান না থাকলে ডিফল্ট মান সেট করা।
  • ট্রানজেকশন প্রিপারেশন: ইনসার্ট করার আগে কিছু প্রিপারেশন কাজ সম্পন্ন করা।

Post-Insert:

  • লগিং: ডেটাবেসে ইনসার্ট হওয়া তথ্য লগ করা।
  • সার্ভিস কল করা: ইনসার্ট হওয়া ডেটা ব্যবহৃত কোনো সার্ভিসে পাঠানো।
  • ডেটা অডিটিং: ডেটা ইনসার্ট হওয়ার পর অডিট বা ট্র্যাকিং তথ্য সিস্টেমে জমা করা।

4. Pre-Insert এবং Post-Insert ইভেন্টের সুবিধা

  • কাস্টমাইজেশন: আপনি ডেটাবেসে ইনসার্ট করার আগে বা পরে কাস্টম কার্যকলাপ যুক্ত করতে পারেন।
  • লজিক ব্যবস্থাপনা: সিস্টেমের ডেটা ইনসার্ট করার সময় অগ্রিম বা পরবর্তী কাজ করার সুযোগ দেয়।
  • ডেটা অখণ্ডতা: ডেটার অখণ্ডতা বজায় রাখতে সহায়তা করে, যেমন, ইনসার্ট করার আগে বা পরে কিছু মান যাচাই বা সেট করা।

Pre-Insert এবং Post-Insert ইভেন্টগুলি NHibernate এ আপনার ডেটাবেস অপারেশনগুলোকে আরও কাস্টমাইজ করতে এবং সিস্টেমে অতিরিক্ত কার্যকলাপ সংযোজন করতে সহায়তা করে, যেমন লগিং, ডেটা ভ্যালিডেশন, বা অন্যান্য সার্ভিস কল।

Content added By

Interceptor Class তৈরি এবং ব্যবহার

333

NHibernate তে Interceptor একটি খুব শক্তিশালী কৌশল যা ডেটাবেস অপারেশনগুলির (যেমন, Save, Update, Delete) উপর পর্যবেক্ষণ এবং কাস্টমাইজেশন করতে সাহায্য করে। আপনি যখন NHibernate তে Interceptor ব্যবহার করেন, তখন আপনি ট্রানজেকশনগুলির মধ্যে কোড এক্সিকিউশন ট্র্যাক করতে পারেন এবং ডেটাবেস অপারেশনগুলির আচরণ পরিবর্তন করতে পারেন।

এখানে Interceptor Class তৈরি এবং ব্যবহার করার পদ্ধতি আলোচনা করা হবে।


Interceptor Class কি?

Interceptor হল একটি কাস্টম ক্লাস যা NHibernate এর ডেটাবেস অপারেশনগুলির মধ্যস্থতাকারী হিসেবে কাজ করে। এটি NHibernate এর বিভিন্ন ইভেন্টের উপর হুক প্রস্তাব করে, যেমন:

  • Entity এর Save অথবা Update আগে বা পরে কিছু কাজ করা।
  • Delete অপারেশন চলাকালে ডেটা পর্যবেক্ষণ করা।
  • Entity লোড বা ফেচ করার সময় কাস্টম কার্যক্রম পরিচালনা করা।

এটি মূলত NHibernate এর Event Listeners বা Hooks এর মত কাজ করে।


Interceptor Class তৈরি

NHibernate Interceptor তৈরি করতে হলে আপনাকে NHibernate.Interceptor ক্লাস থেকে Custom Interceptor তৈরি করতে হবে এবং ঐ ক্লাসে প্রয়োজনীয় Override মেথডগুলো ডিফাইন করতে হবে।

ধরা যাক, আমরা একটি Interceptor তৈরি করব যা Entity Save এর আগে লগিং করবে।

Custom Interceptor তৈরি

using NHibernate;
using NHibernate.Interceptor;
using System;

public class MyCustomInterceptor : EmptyInterceptor
{
    public override bool OnSave(object entity, object id, string entityName, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        if (entity is Employee employee)
        {
            Console.WriteLine($"Saving Employee: {employee.Name}, Age: {employee.Age}");
        }

        // Proceed with the actual save
        return base.OnSave(entity, id, entityName, state, propertyNames, types);
    }

    public override bool OnUpdate(object entity, object id, string entityName, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        if (entity is Employee employee)
        {
            Console.WriteLine($"Updating Employee: {employee.Name}, Age: {employee.Age}");
        }

        // Proceed with the actual update
        return base.OnUpdate(entity, id, entityName, currentState, previousState, propertyNames, types);
    }

    public override bool OnDelete(object entity, object id, string entityName, object[] state, string[] propertyNames, NHibernate.Type.IType[] types)
    {
        if (entity is Employee employee)
        {
            Console.WriteLine($"Deleting Employee: {employee.Name}, Age: {employee.Age}");
        }

        // Proceed with the actual delete
        return base.OnDelete(entity, id, entityName, state, propertyNames, types);
    }
}

এখানে:

  • OnSave, OnUpdate, এবং OnDelete মেথডগুলো ব্যবহার করা হয়েছে, যা যথাক্রমে Entity সেভ, আপডেট, এবং ডিলিট করার সময় কাস্টম কোড এক্সিকিউট করতে সাহায্য করে।
  • base.OnSave() বা base.OnUpdate() কল করার মাধ্যমে আসল NHibernate অপারেশন সম্পন্ন হতে দেওয়া হয়, অর্থাৎ আমরা আগে কিছু প্রক্রিয়া চালিয়ে তারপর আসল অপারেশনটি হতে দিচ্ছি।

Interceptor ব্যবহার করা

একটি Interceptor ব্যবহার করার জন্য আপনাকে NHibernate সেশন তৈরি করার সময় এটি কনফিগার করতে হবে। নিম্নলিখিত কোডে MyCustomInterceptor ব্যবহার করার উদাহরণ দেওয়া হল:

using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
    // Create a transaction
    using (var transaction = session.BeginTransaction())
    {
        // Add custom interceptor
        session.SetInterceptor(new MyCustomInterceptor());

        var employee = new Employee
        {
            Name = "John Doe",
            Age = 30
        };

        session.Save(employee);  // This will trigger the OnSave method of the interceptor

        transaction.Commit();
    }
}

এখানে:

  • session.SetInterceptor(new MyCustomInterceptor()) দিয়ে কাস্টম Interceptor যুক্ত করা হয়েছে।
  • যখন session.Save() কল করা হবে, তখন এটি MyCustomInterceptor এর OnSave মেথডটি কল করবে এবং সেখানে আপনি লগিং বা কোনো অতিরিক্ত কাজ করতে পারবেন।

Common Interceptor Methods

NHibernate এর Interceptor ক্লাসে কয়েকটি সাধারণ মেথড রয়েছে, যেগুলি বিভিন্ন ইভেন্টে হুক করতে ব্যবহৃত হয়। এগুলি হল:

  1. OnSave: যখন কোনো Entity সেভ করা হয়, তখন এই মেথডটি কল হয়।
  2. OnUpdate: যখন কোনো Entity আপডেট করা হয়, তখন এই মেথডটি কল হয়।
  3. OnDelete: যখন কোনো Entity ডিলিট করা হয়, তখন এই মেথডটি কল হয়।
  4. OnLoad: Entity লোড করার সময় এই মেথডটি কল হয়।
  5. PreFlush: ট্রানজেকশন কমিট হওয়ার আগে এই মেথডটি কল হয়। সাধারণত ডেটাবেসে পরিবর্তন পাঠানোর আগে কার্যকর হয়।
  6. PostFlush: ট্রানজেকশন কমিট হওয়ার পরে এই মেথডটি কল হয়।

আপনি এই মেথডগুলোর যেকোনো একটি অথবা একাধিক মেথড override করে কাস্টম লজিক প্রয়োগ করতে পারেন।


Interceptor এর অন্যান্য ব্যবহারের ক্ষেত্র

Interceptor ক্লাসের মাধ্যমে আপনি আরো অনেক ধরনের কাস্টম কার্যক্রম পরিচালনা করতে পারেন, যেমন:

  • Logging: Entity সেভ, আপডেট, এবং ডিলিট করার সময় লগ তৈরি করা।
  • Audit Trails: Entity এর সমস্ত পরিবর্তন ট্র্যাক করা।
  • Security: Entity অপারেশন করার সময় ইউজারের পারমিশন চেক করা।
  • Performance Monitoring: ডেটাবেস অপারেশনের পারফরম্যান্স ট্র্যাক করা।

এটি একটি শক্তিশালী টুল যা NHibernate এর আচরণ কাস্টমাইজ এবং পর্যবেক্ষণ করার জন্য ব্যবহৃত হয়।


সারাংশ

Interceptor ব্যবহার করে আপনি NHibernate এর ডেটাবেস অপারেশনগুলির আচরণ কাস্টমাইজ করতে পারেন, যেমন সেভ, আপডেট, ডিলিট ইত্যাদি। এটি ডেটাবেসের সাথে ইন্টারঅ্যাকশন করার সময় অতিরিক্ত প্রক্রিয়া, যেমন লগিং, সিকিউরিটি চেক বা অডিট ট্রেইল সংরক্ষণ করার জন্য ব্যবহৃত হয়। Interceptor ব্যবহার করতে NHibernate সেশনে সেট করা হয় এবং এরপর নির্দিষ্ট ইভেন্টের সাথে সম্পর্কিত কাস্টম কোড এক্সিকিউট করা হয়।

Content added By

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

318

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...