در دنیای توسعهٔ نرمافزار، بهخصوص در پروژههای ASP.NET Core، مفاهیمی مثل Repository و Service زیاد به گوش میخورند.
اگر تازهوارد این حوزه شدهای یا حتی کمی تجربه داری، شاید این سؤال برایت پیش آمده باشد که تفاوت این دو در چیست و چرا باید از هرکدام استفاده کنیم؟
در این مقاله میخواهیم به زبان ساده این موضوع را بررسی کنیم.
Repository چیست؟
Repository یا همان «مخزن داده»، لایهای است که ارتباط مستقیم با پایگاه داده را مدیریت میکند. این لایه کارهایی مانند دریافت، ایجاد، بهروزرسانی و حذف اطلاعات را انجام میدهد و معمولاً روی EF Core، Dapper یا هر ORM دیگری ساخته میشود.
✅ وظایف اصلی Repository
- خواندن و نوشتن دادهها از پایگاه داده
- جدا کردن دسترسی دادهها از منطق کسبوکار
🔷 یک مثال از Repository در مدیریت مقالهها:
public interface IArticleRepository
{
Article GetById(int id);
IEnumerable<Article> GetAll();
void Add(Article article);
void Update(Article article);
void Delete(int id);
}
public class ArticleRepository : IArticleRepository
{
private readonly AppDbContext _context;
public ArticleRepository(AppDbContext context)
{
_context = context;
}
public Article GetById(int id) => _context.Articles.Find(id);
public IEnumerable<Article> GetAll() => _context.Articles.ToList();
public void Add(Article article)
{
_context.Articles.Add(article);
_context.SaveChanges();
}
public void Update(Article article)
{
_context.Articles.Update(article);
_context.SaveChanges();
}
public void Delete(int id)
{
var article = _context.Articles.Find(id);
if (article != null)
{
_context.Articles.Remove(article);
_context.SaveChanges();
}
}
}
Service چیست؟
به کمک Serviceها اطلاعات را از Repository دریافت میکنیم و با آن منطق برنامهٔ خود را پیادهسازی میکنیم.
✅ وظایف اصلی Service
- پیادهسازی منطق کسبوکار (Business Logic)
- امکان ترکیب چند Repository
- انجام پردازشها و اعتبارسنجیها
- جلوگیری از درگیری مستقیم کنترلر با Repository
🔷 یک مثال از Service در مدیریت مقالهها:
public interface IArticleService
{
void CreateArticle(Article article);
Article GetArticle(int id);
IEnumerable<Article> GetAllArticles();
void UpdateArticle(Article article);
void RemoveArticle(int id);
}
public class ArticleService : IArticleService
{
private readonly IArticleRepository _articleRepository;
public ArticleService(IArticleRepository articleRepository)
{
_articleRepository = articleRepository;
}
public void CreateArticle(Article article)
{
if (string.IsNullOrWhiteSpace(article.Title))
throw new Exception("عنوان مقاله نباید خالی باشد.");
_articleRepository.Add(article);
}
public Article GetArticle(int id) =>
_articleRepository.GetById(id);
public IEnumerable<Article> GetAllArticles() =>
_articleRepository.GetAll();
public void UpdateArticle(Article article)
{
if (article.Id <= 0)
throw new Exception("شناسه مقاله نامعتبر است.");
_articleRepository.Update(article);
}
public void RemoveArticle(int id)
{
if (id <= 0)
throw new Exception("شناسه نامعتبر است.");
_articleRepository.Delete(id);
}
}
💡 چرا باید از اینها استفاده کنیم؟
- تستپذیری کدها بالا میرود
- انعطافپذیری و نگهداری کدها راحتتر میشود
امیدوارم کل مطلب را گرفته باشید و برایتان مفید بوده باشد. اگر پیشنهاد و راهنمایی داشتید با نهایت میل پذیرای آن هستم. به هر حال همهٔ ما شاگردیم و جای پیشرفت همیشه وجود دارد :)