Pembuatan Aplikasi Client Server dengan Arsitektur 3-tier Part 2

Posted by Kamarudin • 6 minute read • Comments

Setelah selesai dengan project SmartLibraryLib akan kita lanjutkan dengan pembuatan project SmartLibraryServer.

Untuk menyederhanakan pembahasan, project SmartLibraryServer ini dibuat dengan memanfaatkan project bertipe Console Application (implementasi aslinya bisa kita jadikan sebuah service).

Isi dari project ini hanya berupa class DAO (Data Access Object) :

Semua class DAO diatas mengimplementasikan interface IDao yang diambil dari file SmartLibraryLib.dll, selain itu class-class tersebut merupakan turunan dari class MarshalByRefObject. Sebuah class yang merupakan turunan dari class MarshalByRefObject, semua method-methodnya bisa diakses secara remote.

Aktifkan kembali solution SmartLibrarynya dimana didalamnya sudah ada project SmartLibraryLib

kita akan menambahkan project SmartLibraryServer masih di solution yang sama

  1. Klik kanan Solution SmartLibrary -> Add -> New Project

  2. Pada dialog Add New Project aktifkan pilihan Visual C# kemudian pada pilihan Templates pilih Console Application

    Pada isian Name isikan SmartLibraryServer untuk isian Location dibiarkan saja setelah itu klik Ok

    Jika langkah sebelumnya berhasil maka pada solution SmartLibrary akan ketambahan 1 project baru yaitu SmartLibraryServer

Menambahkan Folder Dao

Pada folder ini kita akan menyimpan semua class Dao yang mengimplementasikan interface IDao yang kita ambil dari file SmartLibraryLib.dll

  1. Klik kanan project SmartLibraryServer -> Add -> New Folder

Menambahkan Class BukuDao dan PenerbitDao

Tidak seperti class model yang hanya berisi property-property, pada class Dao hanya berisi method-method yang mendefinisikan semua method-method abstract dari interface yang diimplementasikannya, method-method inilah yg dikenal dengan istilah method-method CRUD.

Sebagai contoh kita akan menambahkan class BukuDao dan PenerbitDao. Kedua class tersebut masing-masing mengimplementasikan interface IBukuDao dan IPenerbitDao.

  1. Klik kanan folder Dao -> Add -> Class..

  2. Untuk isian Name diisi BukuDao.

    Setelah itu akan tampil editor code class BukuDao

    Jangan lupa untuk menambahkan access modifier public.

Sebelum kita bisa melengkapi kode dari class BukuDao terlebih dulu kita harus menambahkan referensi SmartLibraryLib.dll yang sudah kita bahas pada postingan sebelumnya, tujuannya adalah agar class BukuDao bisa mengakses class model Buku dan interface IBukuDao untuk kemudian mengimplementasikan semua method abstractnya.

  1. Klik kanan folder References -> Add Reference…

  2. Aktifkan tab Projects kemudian pilih project SmartLibraryLib

  3. Jika langkah sebelumnya berhasil akan ketambahan 1 buah node dengan nama SmartLibraryLib pada folder References

Selanjutnya kita mulai melengkapi kode dari class BukuDao.

Sampai disini kita sudah bisa mencoba untuk menjalankan program dengan menekan tombol F5 (Start Debugging).

Apa yang terjadi ??? Masih error bukan ? :stuck_out_tongue:

Error ini terjadi karena class BukuDao mengimplementasikan interface IBukuDao sedangkan method-method abstractnya belum kita definisikan di class BukuDao.

Berikut method-method abstract interface IBukuDao yang harus diimplementasikan oleh class BukuDao.

Mengimplementasikan Method Abastract Interface IBukuDao secara Otomatis.

Untuk mengatasi error pada langkah sebelumnya kita tinggal klik kanan pada tulisan interface IBukuDo ->Implement Interface -> Implement Interface

Kemudian secara otomatis semua method abstract dari interface IBukuDao akan ditambahkan.

public List<Buku> GetByName(string judul)
{
    throw new Exception("The method or operation is not implemented.");
}

public Buku GetByID(string bukuID)
{
    throw new Exception("The method or operation is not implemented.");
}

public DataSet GetReportByName(string judul)
{
    throw new Exception("The method or operation is not implemented.");
}

public int Save(Buku buku)
{
    throw new Exception("The method or operation is not implemented.");
}

public int Update(Buku buku)
{
    throw new Exception("The method or operation is not implemented.");
}

public int Delete(Buku buku)
{
    throw new Exception("The method or operation is not implemented.");
}

public List<Buku> GetAll()
{
    throw new Exception("The method or operation is not implemented.");
}

public DataSet GetReportAll()
{
    throw new Exception("The method or operation is not implemented.");
}

Selanjutnya kita tinggal melengkapi masing-masing method diatas.

public List<Buku> GetByName(string judul)
{
    List<Buku> daftarBuku = new List<Buku>();

    strSql = "SELECT isbn, judul, edisi, bahasa " +
             "FROM buku " +
             "WHERE judul LIKE @1 " +
             "ORDER BY judul";
    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
    {
        cmd.Parameters.AddWithValue("@1", "%" + judul + "%");
        using (OleDbDataReader dtr = cmd.ExecuteReader())
        {
            while (dtr.Read())
            {
                Buku Buku = new Buku();
                Buku.ISBN = dtr[0] is DBNull ? string.Empty : dtr.GetString(0);
                Buku.Judul = dtr[1] is DBNull ? string.Empty : dtr.GetString(1);
                Buku.Edisi = dtr[2] is DBNull ? string.Empty : dtr.GetString(2);
                Buku.Bahasa = dtr[3] is DBNull ? string.Empty : dtr.GetString(3);

                daftarBuku.Add(Buku);
            }
        }
    }
    return daftarBuku;
}
public Buku GetByID(string bukuID)
{
    Buku buku = null;

    strSql = "SELECT isbn, judul, edisi, bahasa " +
             "FROM buku " +
             "WHERE isbn = @1";
    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
    {
        cmd.Parameters.AddWithValue("@1", bukuID);
        using (OleDbDataReader dtr = cmd.ExecuteReader())
        {
            if (dtr.Read())
            {
                buku = new Buku();
                buku.ISBN = dtr[0] is DBNull ? string.Empty : dtr.GetString(0);
                buku.Judul = dtr[1] is DBNull ? string.Empty : dtr.GetString(1);
                buku.Edisi = dtr[2] is DBNull ? string.Empty : dtr.GetString(2);
                buku.Bahasa = dtr[3] is DBNull ? string.Empty : dtr.GetString(3);
            }
        }
    }
    return buku;
}
public int Save(Buku buku)
{
    strSql = "INSERT INTO buku (isbn, judul, edisi, bahasa, penerbit_id) " +
             "VALUES (@1, @2, @3, @4, @5)";
    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
    {
        cmd.Parameters.AddWithValue("@1", buku.ISBN);
        cmd.Parameters.AddWithValue("@2", buku.Judul);
        cmd.Parameters.AddWithValue("@3", buku.Edisi);
        cmd.Parameters.AddWithValue("@4", buku.Bahasa);
        cmd.Parameters.AddWithValue("@5", buku.Penerbit.PenerbitID);

        return cmd.ExecuteNonQuery();
    }
}
public int Update(Buku buku)
{
    strSql = "UPDATE buku SET judul = @1, edisi = @2, bahasa = @3, penerbit_id = @4 " +
             "WHERE isbn = @5";
    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
    {
        cmd.Parameters.AddWithValue("@1", buku.Judul);
        cmd.Parameters.AddWithValue("@2", buku.Edisi);
        cmd.Parameters.AddWithValue("@3", buku.Bahasa);
        cmd.Parameters.AddWithValue("@4", buku.Penerbit.PenerbitID);
        cmd.Parameters.AddWithValue("@5", buku.ISBN);

        return cmd.ExecuteNonQuery();
    }
}
public int Delete(Buku buku)
{
    strSql = "DELETE FROM buku WHERE isbn = @1";
    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
    {
        cmd.Parameters.AddWithValue("@1", buku.ISBN);

        return cmd.ExecuteNonQuery();
    }
}
public List<Buku> GetAll()
{
    List<Buku> daftarBuku = new List<Buku>();

    strSql = "SELECT isbn, judul, edisi, bahasa " +
             "FROM buku " +
             "ORDER BY judul";
    using (OleDbCommand cmd = new OleDbCommand(strSql, conn))
    {
        using (OleDbDataReader dtr = cmd.ExecuteReader())
        {
            while (dtr.Read())
            {
                Buku buku = new Buku();
                buku.ISBN = dtr[0] is DBNull ? string.Empty : dtr.GetString(0);
                buku.Judul = dtr[1] is DBNull ? string.Empty : dtr.GetString(1);
                buku.Edisi = dtr[2] is DBNull ? string.Empty : dtr.GetString(2);
                buku.Bahasa = dtr[3] is DBNull ? string.Empty : dtr.GetString(3);

                daftarBuku.Add(buku);
            }
        }
    }
    return daftarBuku;
}
public DataSet GetReportAll()
{
    strSql = "SELECT isbn, judul, edisi, bahasa " +
             "FROM buku " +
             "ORDER BY judul";
    OleDbDataAdapter da = new OleDbDataAdapter();
    da.SelectCommand = new OleDbCommand(strSql, conn);

    DataSet ds = new DataSet();
    da.Fill(ds, "buku");

    return ds;
}

Jika kita perhatikan pada kode diatas, ada beberapa baris kode yang sama tersebar dibeberapa method (GetAll, GetByID, dan GetByName) yaitu kode untuk proses mapping dari hasil SELECT yg tersimpan di dalam object DataReader ke objek buku

Nah dari beberapa referensi yg ada, katanya harus dilakukan proses refactoring, apa itu refactoring ?

Refactoring is the process of improving your code after it has been written by changing the internal structure of the code without changing the external behavior of the code.

Sumber : Refactoring (C#)

Sesuai dg pembahasan kasus kita yang perlu dilakukan cukup refactoring method.

Sebagai contoh kita akan melakukan proses refactoring pada method GetAll, caranya gampang tinggal blok kode yang akan direfactoring kemudian klik kanan -> Refactor -> Extract Method.

kemudian pada isian New method name isikan MappingDtrToObject

jika proses refactoringnya berhasil, satu buah method dengan nama MappingDtrToObject otomatis ditambahkan, selain itu kode yang ada di method GetAll juga otomatis menyesuaikan.

selanjutnya kita tinggal menyesuaikan untuk method-method yang lain (GetByID dan GetByName)

Untuk sementara project SmartLibraryServer ini kita cukupkan dulu sampe disini, masih ada beberapa kode yg belum terselesaikan dan insya Allah akan menjadi PR sy pada postingan berikutnya :grin: dan mudah-mudahan sudah bisa memberikan sedikit gambaran bagaimana project ini bekerja.

Untuk class Penerbit enggak perlu kita bahas karena langkah-langkah pembuatannya sama seperti diatas.

Selamat mencoba :blush:

Comments