Open
Unit of Work Design Pattern

Bir transaction tarafından etkilenen nesnelerin listesini tutar, veritabanını etkileyebilecek her şeyi izler. İşlemleriniz sona erdiğinde, bu işlerin bittiğini kavrar veritabanındaki değişiklikleri sağlar.Unit of Work paketiyle yaptığımız tüm interfaceleri bir interface olarak gönderebiliyoruz.

Unit Of Work Örneği


//Model Katmanındaki bir Table Entity
    public class E_Table
    {
        [Key]
        public int ID { get; set; }
        public string Name { get; set; }
        public string ImageUrl { get; set; }
        public double? Price { get; set; }
    }

Dal Katmanımızda 2 adet klasörümüz var. Abstract (Soyut) ve Concrete (somut).

  public  interface ITableRepository
    {
        IEnumerable<E_Table> GetAll();
    }
    public class TableRepository : ITableRepository
    {
        private WebDbContext context;
        public cTableRepository(WebDbContext prm)
        {
            context = prm;
        }
        public IEnumerable<E_Table> GetAll()
        {
            return context.Tbl_Table;
        }
    }

Şimdi IUnitOfWork ve UnitOfWork diye iki dosya oluşturalım.Interfae ve sınıf.

    public interface IUnitOfWork
    {
         ITableRepository _Itablerepository { get; }
        int Save();
    }
    public class eUnitOfWork: eIUnitOfWork
    {
        private readonly WebDbContext context;
        public eUnitOfWork(WebDbContext prm)
        {
            context = prm;
           _Itablerepository = new TableRepository(context);
        }
         
        public ITableRepository _Itablerepository { get; private set; }
        public int Save()
        {
            return context.SaveChanges();
        }
        public void Dispose()
        {
            context.Dispose();
        }

    }
   //Farklı bir yazılışla şöyle de diyebilirdik, boş ise doldursun.
    public class eUnitOfWork: eIUnitOfWork
    {
        private readonly WebDbContext context;
        public eUnitOfWork(WebDbContext prm)
        {
            context = prm; 
        } 

        cITableRepository _Itbl;
        public cITableRepository _Itablerepository => _Itbl ?? (_Itbl = new cTableRepository(context)); //boş ise doldur

        public int Save()
        {
            return context.SaveChanges();
        }
        public void Dispose()
        {
            context.Dispose();
        } 
    }
        IUnitOfWork uow;
        public HomeController(IUnitOfWork prm)
        {
            uow = prm;
        }

        public IActionResult Index()
        {
           return View(uow._Itablerepository.GetAll());
        }
    
   public void ConfigureServices(IServiceCollection services)
   {
     services.AddScoped<eIUnitOfWork, eUnitOfWork>();
   }       
@model IEnumerable<E_Table>

@foreach (var item in Model)
{
    @Html.DisplayFor(modelItem => item.Name) 
    <img src="~/images/@item.ImageUrl" width="80" height="40"/> 
    @:
}
17.02.2020