C# Unit of Work Kullanımı

Posted by

Merhaba arkadaşlar, bu yazımda sizlere C# Unit of Work Kullanımı konusundan bahsedeceğim.

Unit of Work, bir veya daha fazla veritabanı işlemini bir iş birimi altında gruplandıran ve yöneten bir tasarım desenidir. Bu desen, veritabanı işlemlerinin tutarlı ve koordineli bir şekilde gerçekleştirilmesini sağlar. İş birimi, veritabanı bağlantısı, işlemler ve işlem yönetimi işlevlerini içerir.

Bir blog uygulaması senaryosunda, makale ve yorumlar üzerinde işlemler gerçekleştirilecektir. Kullanıcılar yeni makaleler oluşturabilir, var olan makaleleri güncelleyebilir ve yorumlar ekleyebilir. Bu işlemleri Unit of Work tasarım deseni ile yöneteceğiz.

İlk adımda, bir IRepository<T> arabirimi tanımlayalım. Bu interface, temel veri tabanı işlemlerini içerecektir.

public interface IRepository<T>
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    T GetById(int id);
    IEnumerable<T> GetAll();
}

Ardından, ArticleRepository ve CommentRepository sınıflarımızı oluşturuyoruz.

public class ArticleRepository : IRepository<Article>
{
    private readonly DbContext dbContext;
    private readonly DbSet<Article> dbSet;

    public ArticleRepository(DbContext dbContext)
    {
        this.dbContext = dbContext;
        dbSet = dbContext.Set<Article>();
    }

    public void Add(Article entity)
    {
        dbSet.Add(entity);
    }

    public void Update(Article entity)
    {
        dbSet.Update(entity);
    }

    public void Delete(Article entity)
    {
        dbSet.Remove(entity);
    }

    public Article GetById(int id)
    {
        return dbSet.Find(id);
    }

    public IEnumerable<Article> GetAll()
    {
        return dbSet.ToList();
    }
}

public class CommentRepository : IRepository<Comment>
{
    private readonly DbContext dbContext;
    private readonly DbSet<Comment> dbSet;

    public CommentRepository(DbContext dbContext)
    {
        this.dbContext = dbContext;
        dbSet = dbContext.Set<Comment>();
    }

    public void Add(Comment entity)
    {
        dbSet.Add(entity);
    }

    public void Update(Comment entity)
    {
        dbSet.Update(entity);
    }

    public void Delete(Comment entity)
    {
        dbSet.Remove(entity);
    }

    public Comment GetById(int id)
    {
        return dbSet.Find(id);
    }

    public IEnumerable<Comment> GetAll()
    {
        return dbSet.ToList();
    }
}

Yukarıdaki kodda, IRepository<T> arabirimini ve ArticleRepository ile CommentRepository sınıflarını tanımladık. Her iki sınıf da IRepository<T> interface’ini uyguluyor ve temel veri tabanı işlemlerini gerçekleştiriyor. Her sınıf, ilgili nesneler için Add, Update, Delete, GetById ve GetAll gibi metotları içeriyor.

Gerekli işlemlerimizi sağladık artık Unit of Work işlemlerimizi gerçekleştirebiliriz. Öncelikle IUnitOfWork tanımını yapıyoruz. Bu interface, iş biriminin temel işlevlerini belirleyecektir.

public interface IUnitOfWork : IDisposable
{
    IRepository<Article> ArticleRepository { get; }
    IRepository<Comment> CommentRepository { get; }
    void SaveChanges();
}

IUnitOfWork interface’inde, ArticleRepository ve CommentRepository özellikleri ile makale ve yorumlar üzerindeki işlemleri gerçekleştirmek için IRepository arabirimini kullanıyoruz. SaveChanges() metodu, değişiklikleri kaydedecek ve işlemi tamamlayacak.

Sonraki adımda, UnitOfWork sınıfını tanımlıyoruz.

public class UnitOfWork : IUnitOfWork
{
    private readonly DbContext dbContext;
    private readonly IDbTransaction transaction;

    public UnitOfWork(DbContext dbContext)
    {
        this.dbContext = dbContext;
        transaction = dbContext.Database.BeginTransaction();
        ArticleRepository = new Repository<Article>(dbContext);
        CommentRepository = new Repository<Comment>(dbContext);
    }

    public IRepository<Article> ArticleRepository { get; }
    public IRepository<Comment> CommentRepository { get; }

    public void SaveChanges()
    {
        dbContext.SaveChanges();
        transaction.Commit();
    }

    public void Dispose()
    {
        transaction.Dispose();
        dbContext.Dispose();
    }
}

Son olarak bu desenimizi nasıl kullanacağımızı gerçekleştiriyoruz.

// Kullanım örneği
using (var dbContext = new BlogDbContext()) // Entity Framework Core DbContext örneği
using (var unitOfWork = new UnitOfWork(dbContext))
{
    var articleRepository = unitOfWork.ArticleRepository;
    var commentRepository = unitOfWork.CommentRepository;

    // Yeni bir makale oluştur
    var newArticle = new Article { Title = "Yeni Makale", Content = "Makale içeriği..." };
    articleRepository.Add(newArticle);

    // Yeni bir yorum ekle
    var newComment = new Comment { ArticleId = newArticle.Id, Text = "Harika bir makale!" };
    commentRepository.Add(newComment);

    // Değişiklikleri kaydet
    unitOfWork.SaveChanges();
}

Yukarıdaki kodda, BlogDbContext örneği oluşturulur ve UnitOfWork sınıfı ile birlikte kullanılır. ArticleRepository ve CommentRepository örnekleri oluşturulduktan sonra, yeni bir makale ve yorum oluşturulur. SaveChanges() metodu çağrılarak değişiklikler veri tabanına kaydedilir ve işlemlerimiz tamamlanmış olur.

Umarım faydalı olur.

Bir sonraki yazıda görüşmek üzere…

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir