ASP.NET CORE'da Unit Of Work Design Pattern

Merhaba, bu yazımda ASP.NET CORE'da Unit Of Work tasarım deseninden bahsedeceğim. Bu yazı, daha önce anlattığım Repository Design Pattern konusunun devamı niteliğindedir.
Unit Of Work Tasarım Deseni
Unit of Work, veritabanı işlemlerini yönetmek için kullanılan bir desendir. Bu desen, bir işlem biriminin (transaction) başlamasından, yapılan değişikliklerin veritabanına kaydedilmesine kadar olan süreci yönetir. Temel amacı, veritabanı işlemlerini tutarlı ve hatasız bir şekilde gerçekleştirmektir. Genellikle Repository Design Pattern ile beraber kullanılır.
Unit Of Work'ün Avantajları
- Transaction Yönetimi: Birden fazla işlemi tek bir transaction içinde gerçekleştirerek, tutarlılığı sağlar.
- Değişiklik Takibi: Yapılan değişiklikleri izler ve sadece değişen verileri kaydeder.
- Bağımlılıkların Azaltılması: Repository Pattern ile bağımlılıkları azaltarak, iş mantığı katmanının veri erişim katmanından bağımsız olmasını sağlar.
ASP.NET CORE'da Unit Of Work'ün Uygulaması
Repository Design Patterni anlattığım yazımda zaten bir proje geliştirmiştik. Onun üzerinden devam edelim ve Unit Of Work Tasarım desenini uygulayalım.
Önce IUnitOfWork interface'ini oluşturuyorum;
public interface IUnitOfWork:IDisposable
{
Task CompleteAsync();
}
Şimdi bu interface'i implement edecek sınıfı oluşturalım.
public class UnitOfWork : IUnitOfWork
{
private readonly AppDbContext _context;
public UnitOfWork(AppDbContext context)
{
_context = context;
}
public async Task CompleteAsync()
{
try
{
using (var transaction = _context.Database.BeginTransaction())
{
try
{
await _context.SaveChangesAsync();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
catch (Exception e)
{
//Hata durumu
}
}
public void Dispose()
{
_context.Dispose();
}
}
Burada yaptığımız işlemde, herhangi bir hata durumunda, transaction tamamlanmadan geri dönecek ve yapılan işlemler geri alınacak. Bu sayede veri kaybının önüne de geçilmiş olacak.
Şimdi DI Container'da kullanmak için Program.cs içerisine, oluşturduğumuz UnitOfWork class'ını tanımlayalım.
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();//Unit Of Work
var app = builder.Build();
İşlemlerimiz tamamlandı. Artık Repository'de veya Controller içerisinde istediğimiz yerde bu yapıyı kullanabileceğiz. 👇
private readonly IUnitOfWork _unitOfWork;
public TestController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
[HttpPost(Name = "Add")]
public async Task Add(Product model)
{
await _repository.AddAsync(model);
await _unitOfWork.CompleteAsync();
}
Projemizi tamamlamış olduk 🎉
Proje dosyalarına buradan ulaşabilirsiniz.
Bu yazımda sizlere ASP.NET CORE'da Unit Of Work Tasarım Deseninden bahsettim.
Sabırla okuduğunuz için teşekkür eder, bol kodlu günler dilerim 🤩