Dependency Injection (DI) এবং NHibernate এর ইন্টিগ্রেশন হল আধুনিক অ্যাপ্লিকেশন আর্কিটেকচারের একটি গুরুত্বপূর্ণ অংশ, যেখানে NHibernate কে একটি Dependency Injection কনটেইনারের মাধ্যমে পরিচালনা করা হয়। এটি অ্যাপ্লিকেশনকে আরও মডুলার, টেস্টেবল, এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। DI ব্যবহারের মাধ্যমে, NHibernate এর সেশন এবং ট্রানজেকশন পরিচালনা করা সহজ হয় এবং কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়।
Dependency Injection (DI) কী?
Dependency Injection হল একটি ডিজাইন প্যাটার্ন যেখানে একটি ক্লাস তার নির্ভরশীলতাগুলি (dependencies) অন্য একটি ক্লাস থেকে ইনজেক্ট করে নেয়, পরিবর্তে নিজে সেগুলি তৈরি করার। এটি কোডকে আরও পরিষ্কার, মডুলার, এবং টেস্টেবল করে তোলে।
একটি সহজ উদাহরণ:
- Service Class: যেটি কিছু নির্ভরশীলতা গ্রহণ করে।
- DI Container: যেটি সেই নির্ভরশীলতাগুলি ইনজেক্ট করে।
NHibernate Integration with Dependency Injection
NHibernate এর সাথে DI ইন্টিগ্রেট করার মূল উদ্দেশ্য হলো সেশন এবং ট্রানজেকশন ব্যবস্থাপনা সহজ করা, এবং NHibernate কনফিগারেশন বা কনটেক্সট ম্যানেজমেন্টকে টেস্টিং এবং স্কেলেবিলিটির জন্য আরও নমনীয় করা। সাধারণত, NHibernate SessionFactory এবং Session কে DI কনটেইনারের মাধ্যমে পরিচালনা করা হয়।
NHibernate DI Setup
নিচে কিছু সাধারণ স্টেপ দেওয়া হল, যেগুলি অনুসরণ করে আপনি NHibernate এবং DI কে একত্রিত করতে পারেন।
1. DI Container কনফিগারেশন
প্রথমে, আপনাকে একটি DI কনটেইনার ব্যবহার করতে হবে, যেমন Microsoft.Extensions.DependencyInjection বা Autofac। এই কনটেইনারটি সেশন এবং সেশনফ্যাক্টরি ইঞ্জেক্ট করবে।
Microsoft.Extensions.DependencyInjection ব্যবহার করে:
Install-Package Microsoft.Extensions.DependencyInjection
এখন ServiceCollection ব্যবহার করে NHibernate কনফিগার করুন:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// NHibernate configuration
var configuration = new Configuration();
configuration.Configure(); // Automatically loads hibernate.cfg.xml
// SessionFactory creation
var sessionFactory = configuration.BuildSessionFactory();
// Register SessionFactory as a singleton
services.AddSingleton(sessionFactory);
// Register ISession as a scoped service
services.AddScoped(factory => sessionFactory.OpenSession());
}
}
এখানে:
- AddSingleton: SessionFactory কে একটি singleton হিসেবে রেজিস্টার করা হয়, যাতে এটি অ্যাপ্লিকেশন জুড়ে একটি একক ইনস্ট্যান্স থাকে।
- AddScoped: ISession কে scoped হিসেবে রেজিস্টার করা হয়, যাতে প্রতিটি HTTP রিকোয়েস্টে একটি নতুন সেশন তৈরি হয় এবং পরে তা ডিপেনডেন্সি ইনজেকশনের মাধ্যমে সরবরাহ করা হয়।
2. Session Injection
এরপর, যেখানে আপনি ISession বা SessionFactory ব্যবহার করতে চান, সেখানে ডিপেনডেন্সি ইনজেকশন ব্যবহার করতে পারবেন। এটি সাধারণত রেপোজিটরি বা সার্ভিস ক্লাসে করা হয়।
public class EmployeeService
{
private readonly ISession _session;
public EmployeeService(ISession session)
{
_session = session;
}
public Employee GetEmployee(int id)
{
return _session.Get<Employee>(id);
}
public void SaveEmployee(Employee employee)
{
using (var transaction = _session.BeginTransaction())
{
_session.SaveOrUpdate(employee);
transaction.Commit();
}
}
}
এখানে, EmployeeService ক্লাসে ISession ইনজেক্ট করা হচ্ছে, যা DI কনটেইনার থেকে সরবরাহ করা হচ্ছে।
3. Unit of Work Pattern
Unit of Work প্যাটার্নটি ব্যবহার করে, আপনি ডাটাবেস অপারেশনগুলো একত্রিত করে একটি ট্রানজেকশনে একযোগভাবে পরিচালনা করতে পারেন। এটি অনেক কার্যকরী যখন একাধিক ডেটাবেস অপারেশন একসাথে করতে হয় এবং আপনি চান যে সেগুলির সবগুলো সফলভাবে সম্পন্ন হলে একসাথে কমিট করা হোক।
UnitOfWork Service:
public class UnitOfWork : IUnitOfWork
{
private readonly ISession _session;
private ITransaction _transaction;
public UnitOfWork(ISession session)
{
_session = session;
}
public void BeginTransaction()
{
_transaction = _session.BeginTransaction();
}
public void Commit()
{
_transaction.Commit();
}
public void Rollback()
{
_transaction.Rollback();
}
}
এখানে, UnitOfWork কনটেইনার থেকে ISession ইনজেক্ট করে এবং ট্রানজেকশন পরিচালনা করে।
4. Repository Pattern
Repository Pattern ব্যবহার করে, আপনি ডেটাবেস অপারেশনগুলো অ্যাবস্ট্রাক্ট করতে পারেন এবং NHibernate সেশন ব্যবস্থাপনা কোডকে সরিয়ে রাখতে পারেন। এতে করে কোডের পুনঃব্যবহারযোগ্যতা বাড়ে এবং টেস্টিং সহজ হয়।
Generic Repository:
public class Repository<T> where T : class
{
private readonly ISession _session;
public Repository(ISession session)
{
_session = session;
}
public T GetById(int id)
{
return _session.Get<T>(id);
}
public void Save(T entity)
{
using (var transaction = _session.BeginTransaction())
{
_session.SaveOrUpdate(entity);
transaction.Commit();
}
}
public IEnumerable<T> GetAll()
{
return _session.Query<T>().ToList();
}
}
এখানে, Repository ক্লাসে ডেটাবেসের CRUD অপারেশনগুলো ইনজেক্ট করা হচ্ছে এবং এগুলোর জন্য ISession ব্যবহৃত হচ্ছে।
Advantages of NHibernate with Dependency Injection
- Testability: DI ব্যবহার করে NHibernate সেশন এবং ট্রানজেকশন সহজেই মক করা যায়, যা টেস্টিংয়ের জন্য খুবই উপকারী।
- Separation of Concerns: DI কোডের বিভিন্ন অংশের মধ্যে আলাদা-আলাদা দায়িত্ব ভাগ করে দেয়, যেমন সেশন এবং ডাটাবেস অপারেশনগুলো সেবার মধ্যে কনফিগার করা।
- Scalability: DI কনটেইনার ব্যবহার করলে অ্যাপ্লিকেশন বড় হলে সহজে স্কেল করা যায়।
- Maintainability: কোড পরিষ্কার এবং মডুলার হয়, যা রক্ষণাবেক্ষণ সহজ করে।
সারাংশ
NHibernate এবং Dependency Injection (DI) একসাথে ব্যবহারের ফলে অ্যাপ্লিকেশনটিকে আরও টেস্টেবল, মডুলার এবং স্কেলেবল করা যায়। DI কনটেইনার ব্যবহার করে NHibernate এর সেশন এবং ট্রানজেকশন ম্যানেজমেন্ট আরও কার্যকরী হয়, যার ফলে কোডের গঠন ভালো হয় এবং রক্ষণাবেক্ষণ সহজ হয়। DI ইনজেকশন দিয়ে সেশন এবং ট্রানজেকশন পরিচালনা করলে একাধিক সার্ভিস ও রেপোজিটরির মধ্যে নির্ভরশীলতা সহজে ইনজেক্ট করা যায়, যা অ্যাপ্লিকেশন ডিজাইন এবং কার্যকারিতা উন্নত করে।
Read more