Repository Pattern এবং Unit of Work দুটি সফটওয়্যার ডিজাইন প্যাটার্ন যা ডেটাবেস অপারেশনগুলিকে সুসংগঠিত, রক্ষণাবেক্ষণযোগ্য এবং পুনর্ব্যবহারযোগ্য করতে সাহায্য করে। এই দুটি প্যাটার্ন ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশনগুলি পরিচালনা করার জন্য একটি পরিষ্কার এবং নির্দিষ্ট পদ্ধতি প্রদান করে, বিশেষ করে Entity Framework (EF) বা অন্যান্য ORM (Object-Relational Mapping) ব্যবহার করার সময়।
Repository Pattern
Repository Pattern একটি ডিজাইন প্যাটার্ন যা ডেটাবেস বা অন্যান্য ডেটা সোর্সের সাথে কাজ করার জন্য একটি ইন্টারফেস প্রদান করে। এই প্যাটার্নটি ডেটা অ্যাক্সেস লজিককে অ্যাপ্লিকেশনের অন্য অংশ থেকে আলাদা করে, ফলে কোড মেইনটেনেন্স এবং টেস্টিং সহজ হয়।
Repository Pattern-এর বৈশিষ্ট্য
- ডেটা অ্যাক্সেস লজিককে আলাদা করা: এটি ডেটা অ্যাক্সেস লজিককে অ্যাপ্লিকেশনের মূল লজিক থেকে আলাদা করে রাখে। ফলে, কোড পরিষ্কার এবং মডুলার হয়।
- CRUD অপারেশন: এটি ডেটাবেসের জন্য সাধারণ CRUD অপারেশন (Create, Read, Update, Delete) পরিচালনা করার জন্য একটি API প্রদান করে।
- টেস্টিং সহজ করা: Repository Pattern ব্যবহার করলে, ডেটা অ্যাক্সেস লজিক আলাদা হওয়ার কারণে এটি Unit Testing সহজ করে তোলে। আপনি মক (mock) ডেটা ব্যবহার করে টেস্ট করতে পারবেন।
Repository Interface
public interface IRepository<T> where T : class
{
IEnumerable<T> GetAll();
T GetById(int id);
void Add(T entity);
void Update(T entity);
void Delete(int id);
}
Repository Implementation
public class Repository<T> : IRepository<T> where T : class
{
private readonly ApplicationDbContext _context;
private readonly DbSet<T> _dbSet;
public Repository(ApplicationDbContext context)
{
_context = context;
_dbSet = _context.Set<T>();
}
public IEnumerable<T> GetAll()
{
return _dbSet.ToList();
}
public T GetById(int id)
{
return _dbSet.Find(id);
}
public void Add(T entity)
{
_dbSet.Add(entity);
}
public void Update(T entity)
{
_dbSet.Update(entity);
}
public void Delete(int id)
{
T entity = _dbSet.Find(id);
if (entity != null)
{
_dbSet.Remove(entity);
}
}
}
এইভাবে Repository Pattern ডেটাবেসের সাথে কাজ করার জন্য একটি পরিষ্কার ইন্টারফেস প্রদান করে এবং কোড পুনঃব্যবহারযোগ্য এবং টেস্টযোগ্য করে তোলে।
Unit of Work
Unit of Work একটি ডিজাইন প্যাটার্ন যা একাধিক ডেটাবেস অপারেশন একযোগে একটি ট্রানজেকশনের মধ্যে গ্রুপ করার জন্য ব্যবহৃত হয়। এটি ডেটাবেসে একাধিক অপারেশন করার সময় ডেটার অ্যাটমিক (atomic) সঠিকতা বজায় রাখে, অর্থাৎ যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে সমস্ত অপারেশন বাতিল হয়ে যাবে। এই প্যাটার্নটি ডেটাবেসে পরিবর্তনগুলো সিঙ্ক্রোনাইজ এবং ট্রানজেকশনাল করতে সহায়ক।
Unit of Work-এর বৈশিষ্ট্য
- ট্রানজেকশনাল আচরণ: একাধিক অপারেশনকে একটি একক ট্রানজেকশনে সম্পন্ন করে।
- ডেটাবেসে একাধিক পরিবর্তন: একাধিক Repository এর মধ্যে পরিবর্তনগুলিকে একযোগে পরিচালনা করে।
- কমপ্লেক্স অপারেশন: যখন একাধিক ডেটাবেস অপারেশন একটি সময়ে সম্পন্ন করতে হয়, তখন Unit of Work এটি সমাধান করে।
Unit of Work Interface
public interface IUnitOfWork : IDisposable
{
IRepository<Student> Students { get; }
IRepository<Course> Courses { get; }
int Complete();
}
Unit of Work Implementation
public class UnitOfWork : IUnitOfWork
{
private readonly ApplicationDbContext _context;
private IRepository<Student> _students;
private IRepository<Course> _courses;
public UnitOfWork(ApplicationDbContext context)
{
_context = context;
}
public IRepository<Student> Students => _students ??= new Repository<Student>(_context);
public IRepository<Course> Courses => _courses ??= new Repository<Course>(_context);
public int Complete()
{
return _context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}
Unit of Work ব্যবহার
using (var unitOfWork = new UnitOfWork(new ApplicationDbContext()))
{
var student = new Student { Name = "John", Age = 20 };
unitOfWork.Students.Add(student);
var course = new Course { Title = "Mathematics" };
unitOfWork.Courses.Add(course);
unitOfWork.Complete();
}
এখানে, একাধিক Repository ব্যবহার করা হয়েছে (Students এবং Courses), এবং সমস্ত পরিবর্তনগুলো একসাথে Complete মেথডে সেভ করা হয়েছে। এটি একটি ট্রানজেকশনের মতো কাজ করে।
Repository Pattern এবং Unit of Work-এর পার্থক্য
| বৈশিষ্ট্য | Repository Pattern | Unit of Work |
|---|---|---|
| কাজ | একক ডেটাবেস টেবিলের জন্য CRUD অপারেশন সম্পন্ন করে। | একাধিক Repository এর মধ্যে একত্রিত অপারেশন পরিচালনা করে। |
| সততা (Consistency) | একক ডেটাবেস টেবিলের মধ্যে পরিবর্তন সংরক্ষণ করে। | একাধিক Repository-এর পরিবর্তনগুলি একত্রে নিশ্চিত করে। |
| ডেটাবেস অপারেশন | CRUD অপারেশন | একাধিক Repository-র মধ্যে পরিবর্তনগুলো একত্রে সেভ বা রোলব্যাক করা হয়। |
| ট্রানজেকশন | ট্রানজেকশনাল নয় | ট্রানজেকশনাল আচরণ প্রদান করে (যদি একটি ব্যর্থ হয়, সবাই রোলব্যাক হয়)। |
সারমর্ম
Repository Pattern এবং Unit of Work দুটি গুরুত্বপূর্ণ প্যাটার্ন যা ডেটাবেস অপারেশনগুলিকে সুসংগঠিত এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। Repository Pattern ডেটাবেসে CRUD অপারেশনগুলি পরিচালনার জন্য একটি পরিষ্কার ইন্টারফেস প্রদান করে, এবং Unit of Work একাধিক অপারেশনকে একত্রে পরিচালনা করে ট্রানজেকশনাল আচরণ নিশ্চিত করে। এই প্যাটার্নগুলো ব্যবহার করলে আপনার অ্যাপ্লিকেশনটি আরও মডুলার, টেস্টযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে।
Read more