Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

Repository Pattern

| Comments

Pada postingan kali ini saya ingin membahas salah satu design pattern yang sering digunakan ketika bekerja dengan database yaitu Repository Pattern.

Sebenarnya saya kurang tertarik untuk membahas tentang Repository Pattern karena memang sudah banyak artikel atau tutorial yang membahas tentang masalah ini. Tetapi berhubung beberapa postingan saya kedepan membutuhkan pengetahuan tentang Repository Pattern, jadi saya pikir akan lebih baik jika masalah ini juga dibahas di blog ini, dari pada saya harus me-link ke halaman web yang lain.

Akses terhadap database merupakan bagian yang sangat penting dari aplikasi database. Penggunaan pattern/pola yang sesuai dapat memberikan manfaat yang sangat besar. Salah satu pattern yang sering digunakan dalam akses database adalah Repository Pattern.

Pattern/pola ini digunakan untuk menerapkan konsep separation of concern atau pemisahan kode program berdasarkan fungsinya. Semua kode untuk akses database harus dipisahkan dengan kode untuk pengaturan user inteface. Hal ini memungkinkan kode akses database yang dibuat untuk aplikasi desktop, dengan mudah digunakan untuk aplikasi web. Selain itu penerapan konsep separation of concern secara disiplin, dapat menghasilkan kode program yang dapat dites secara otomatis menggunakan tool Unit Testing.

Repository Pattern berisi semua kode untuk mengakses database. Semua kode yang sepesifik terhadap implementasi akses database berhenti di sini, lapisan lebih atas tidak boleh tahu bagaimana akses database diterapkan, apakah menggunakan ADO.NET murni atau tool ORM/Micro ORM seperti Dapper.NET, Entity Framework atau NHibernate. Lapisan lainya hanya perlu tahu fungsionalitas dari suatu method di dalam class Repository, tidak perlu tahu bagimana method tersebut diimplementasikan.

Idealnya secara logic, arsitektur aplikasi yang kita gunakan seperti berikut :

Tetapi untuk menyederhanakan pembahasan business logic layer bisa kita gabung ke presentation layer, sehingga arsitekturnya menjadi seperti berikut :

Class Repository biasanya mempunyai beberapa method CRUD standar seperti Save, Update, Delete, GetById atau GetAll. Untuk method-method CRUD lainnya bisa ditambahkan sesuai kebutuhan.

Secara umum ketika menggunakan Repository Pattern setiap table akan dibuatkan class model dan repositorynya.

Class Model/Entity

Selain membuat class repository, setiap table juga dibuatkan class model/entity yang merupakan representasi dari sebuah table, kemudian di dalam class ini juga kita definisikan property-property yang merupakan representasi kolom/field dari sebuah tabel.

Jadi dengan menggunakan class model/entity kita tidak lagi berhubungan dengan baris dan kolom tetapi langsung berhubungan dengan objek dari masing-masing class entity/model. Sehingga ketika kita menuliskan objek Category kemudian diikuti dengan karakter titik (.), IDE Visual Studio bisa membantu kita dengan fasilitas IntelliSensenya untuk menampilkan daftar property apa saja yang tersedia, sehingga aktivitas mengingat nama field berikut tipe datanya sudah tidak diperlukan lagi :)

Berikut contoh class model/entity dari tabel Category

Membuat Interface

Ketika berbicara tentang Repository Pattern, kita tidak akan jauh-jauh dari yang namanya interface. Interface di sini berfungsi sebagai kontrak yang mendiskripsikan method/operasi apa saja yang harus diimplementasikan oleh sebuah class. Contoh beberapa method/operasi standar yang biasa digunakan untuk mengakses database :

  • Menambahkan data baru (Save)
  • Mengupdate/edit data (Update)
  • Menghapus data (Delete)
  • Menampilkan semua data (GetAll)

Nah berdasarkan method standar di atas kita bisa membuat interface dasar yang akan digunakan oleh interface-interface yang lebih spesifik/khusus.

Karakter T pada kode di atas merupakan indikator tipe generic, artinya nilai T tersebut bisa diganti dengan tipe apapun selama tipe tersebut berupa class.

Setelah membuat interface dasar, kita bisa membuat interface yang lebih spesifik/khusus.

Pada kode di atas, nilai T diganti dengan class Category dan Product. Selain itu interface ICategoryRepository dan IProductRepository merupakan turunan dari interface IBaseRepository, artinya interface ICategoryRepository dan IProductRepository akan mewarisi semua method abstract dari interface IBaseRepository.

Penggunaan interface dalam menulis program, dikenal dengan istilah Programming to interface yang merupakan best practice yang sebaiknya kita ikuti dalam menulis program. Interface memisahkan apa(what) dengan bagaimana(how) nantinya hal tersebut implementasikan. Dengan menggunakan interface, struktur kode kita menjadi loosely-coupled, karena memungkinkan secara dinamis mengganti implementasi.

Membuat Class Repository

Setelah membuat interface repository (ICategoryRepository dan IProductRepository) kita lanjutkan dengan membuat class repository yang mengimplementasikan interface ICategoryRepository dan IProductRepository. Masing-masing class repository ini akan mengimplementasikan semua method abstract yang ada di dalam interface ICategoryRepository dan IProductRepository.

Kemudian lengkapi kodenya seperti berikut :

Membuat Class Context

Di dalam Repository Pattern, class context adalah class yang bertanggung jawab untuk berinteraksi secara langsung dengan database. Jadi class contextlah yang bertanggungjawab untuk membuat koneksi, menjalankan perintah sql seperti insert, update, delete dan select atau objek database seperti store procedure dan function.

Di dalam contoh ini saya tidak menggunakan library ADO.NET secara langsung untuk berinteraksi dengan database, tetapi menggunakan Micro ORM Dapper.NET. Jadi kita akan membuat interface dan class konkretnya dengan nama IDapperContext dan DapperContext. Berikut kode lengkapnya :

Menghubungkan Class Context dan Class Repository

Karena class repository merupakan class yang bertanggungjawab untuk urusan CRUD, tentunya class ini membutuhkan objek dari class Context dalam prosesnya. Nah untuk melewatkan objek context ke class repository bisa dengan menggunakan property atau constructor. Untuk contoh di sini kita menggunakan constructor.

Testing Class Repository

Setelah class Repository selesai dibuat, berikutnya kita akan melakukan tes sederhana dengan menggunakan aplikasi console. Dari hasil tes ini akan terlihat bahwa aplikasi pada layer presentation (UI) akan berkerja dengan object dan collection, jadi sudah tidak ada hubungannya lagi dengan database.

Selamat MENCOBA :)

Comments