Bagaimana menerapkan pola desain Repositori di C #

Pola desain digunakan sebagai solusi untuk masalah yang berulang dalam aplikasi Anda, dan pola Repositori adalah salah satu pola desain yang paling banyak digunakan. Ini akan mempertahankan objek Anda tanpa perlu mengetahui bagaimana objek tersebut akan benar-benar bertahan dalam database yang mendasarinya, yaitu, tanpa harus peduli tentang bagaimana persistensi data terjadi di bawahnya. Pengetahuan tentang ketekunan ini, yaitu logika ketekunan, dikemas di dalam Repositori.

Intinya, pola desain Repositori memfasilitasi pemisahan logika bisnis dan lapisan akses data dalam aplikasi Anda dengan yang sebelumnya tidak harus memiliki pengetahuan tentang bagaimana persistensi data akan benar-benar terjadi.

Dalam menggunakan pola desain Repositori, Anda bisa menyembunyikan detail tentang bagaimana data pada akhirnya disimpan atau diambil ke dan dari penyimpanan data. Penyimpanan data ini dapat berupa database, file xml, dll. Anda dapat menerapkan pola desain ini bahkan untuk menyembunyikan bagaimana data yang diekspos oleh layanan web atau ORM diakses. Martin Fowler menyatakan: "Memediasi antara domain dan lapisan pemetaan data menggunakan antarmuka seperti koleksi untuk mengakses objek domain."

Repositori didefinisikan sebagai kumpulan objek domain yang berada di memori. MSDN menyatakan: "Gunakan Repositori untuk memisahkan logika yang mengambil data dan memetakannya ke model entitas dari logika bisnis yang bekerja pada model. Logika bisnis harus agnostik dengan jenis data yang terdiri dari lapisan sumber data . Misalnya, lapisan sumber data dapat berupa database, daftar SharePoint, atau layanan Web. "

Menerapkan pola desain Repositori di C #

Pada bagian ini kita akan mengeksplorasi bagaimana kita dapat memprogram pola desain Repositori. Dalam implementasi pola desain Repositori kami, tipe yang berpartisipasi meliputi berikut ini:

  1. Antarmuka IRepositori - antarmuka ini adalah tipe dasar untuk semua jenis Repositori
  2. Kelas Repositori - ini adalah kelas Repositori generik
  3. Satu atau lebih kelas Repositori yang mengimplementasikan antarmuka IRepository

Sekarang mari kita menggali beberapa kode. Kelas berikut menunjukkan bagaimana Anda dapat mendefinisikan kelas entitas dasar dari mana semua kelas entitas Anda harus diturunkan.

public abstract class EntityBase

   {

       public Int64 Id { get; protected set; }

   }

Kelas didefinisikan sebagai abstrak dengan hanya satu bidang - bernama "Id". Kolom "Id" umum untuk semua entitas yang biasanya Anda gunakan, bukan? Berikut tampilan antarmuka IRepository generik.

public interface IRepository where T : EntityBase

   {

       T GetById(Int64 id);

       void Create(T entity);

       void Delete(T entity);

       void Update(T entity);

   }

Kelas Repositori generik mengimplementasikan antarmuka IRepository dan mengimplementasikan anggota antarmuka.

public class Repository : IRepository where T : EntityBase

   {

       public void Create(T entity)

       {

           //Write your logic here to persist the entity

       }

       public void Delete(T entity)

       {

           //Write your logic here to delete an entity

       }

       public T GetById(long id)

       {

           //Write your logic here to retrieve an entity by Id

           throw new NotImplementedException();

       }

       public void Update(T entity)

       {

           //Write your logic here to update an entity

       }

   }

Membuat repositori untuk kelas tertentu

Jika Anda ingin membuat Repositori untuk entitas tertentu, Anda harus membuat kelas yang mengimplementasikan antarmuka IRepository generik. Daftar kode berikut menunjukkan bagaimana hal ini dapat dicapai.

public class CustomerRepository : IRepository

   {

       //Write your code here to implement each of the methods of the IRepository interface.

   }

Demikian pula, jika Anda akan membuat ProductRepository, Anda harus terlebih dahulu membuat produk kelas entitas yang memperluas kelas EntityBase.

public class Product: EntityBase

   {

       public string ProductName { get; set; }

       public string Category { get; set; }

   }

Kelas ProductRepository harus mengimplementasikan antarmuka IRepository generik. Berikut tampilan kelas ProductRepository.

public class ProductRepository : IRepository

   {

       //Write your code here to implement each of the methods of the IRepository interface.

   }