Repository Pattern এবং Unit of Work দুটি সফটওয়্যার ডিজাইন প্যাটার্ন যা ডেটাবেস অপারেশনগুলিকে সুসংগঠিত, রক্ষণাবেক্ষণযোগ্য এবং পুনর্ব্যবহারযোগ্য করতে সাহায্য করে। এই দুটি প্যাটার্ন ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশনগুলি পরিচালনা করার জন্য একটি পরিষ্কার এবং নির্দিষ্ট পদ্ধতি প্রদান করে, বিশেষ করে Entity Framework (EF) বা অন্যান্য ORM (Object-Relational Mapping) ব্যবহার করার সময়।
Repository Pattern একটি ডিজাইন প্যাটার্ন যা ডেটাবেস বা অন্যান্য ডেটা সোর্সের সাথে কাজ করার জন্য একটি ইন্টারফেস প্রদান করে। এই প্যাটার্নটি ডেটা অ্যাক্সেস লজিককে অ্যাপ্লিকেশনের অন্য অংশ থেকে আলাদা করে, ফলে কোড মেইনটেনেন্স এবং টেস্টিং সহজ হয়।
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);
}
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 একটি ডিজাইন প্যাটার্ন যা একাধিক ডেটাবেস অপারেশন একযোগে একটি ট্রানজেকশনের মধ্যে গ্রুপ করার জন্য ব্যবহৃত হয়। এটি ডেটাবেসে একাধিক অপারেশন করার সময় ডেটার অ্যাটমিক (atomic) সঠিকতা বজায় রাখে, অর্থাৎ যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে সমস্ত অপারেশন বাতিল হয়ে যাবে। এই প্যাটার্নটি ডেটাবেসে পরিবর্তনগুলো সিঙ্ক্রোনাইজ এবং ট্রানজেকশনাল করতে সহায়ক।
public interface IUnitOfWork : IDisposable
{
IRepository<Student> Students { get; }
IRepository<Course> Courses { get; }
int Complete();
}
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();
}
}
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 |
---|---|---|
কাজ | একক ডেটাবেস টেবিলের জন্য CRUD অপারেশন সম্পন্ন করে। | একাধিক Repository এর মধ্যে একত্রিত অপারেশন পরিচালনা করে। |
সততা (Consistency) | একক ডেটাবেস টেবিলের মধ্যে পরিবর্তন সংরক্ষণ করে। | একাধিক Repository-এর পরিবর্তনগুলি একত্রে নিশ্চিত করে। |
ডেটাবেস অপারেশন | CRUD অপারেশন | একাধিক Repository-র মধ্যে পরিবর্তনগুলো একত্রে সেভ বা রোলব্যাক করা হয়। |
ট্রানজেকশন | ট্রানজেকশনাল নয় | ট্রানজেকশনাল আচরণ প্রদান করে (যদি একটি ব্যর্থ হয়, সবাই রোলব্যাক হয়)। |
Repository Pattern এবং Unit of Work দুটি গুরুত্বপূর্ণ প্যাটার্ন যা ডেটাবেস অপারেশনগুলিকে সুসংগঠিত এবং রক্ষণাবেক্ষণযোগ্য করে তোলে। Repository Pattern ডেটাবেসে CRUD অপারেশনগুলি পরিচালনার জন্য একটি পরিষ্কার ইন্টারফেস প্রদান করে, এবং Unit of Work একাধিক অপারেশনকে একত্রে পরিচালনা করে ট্রানজেকশনাল আচরণ নিশ্চিত করে। এই প্যাটার্নগুলো ব্যবহার করলে আপনার অ্যাপ্লিকেশনটি আরও মডুলার, টেস্টযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে।
common.read_more