Home > .NET Remoting, Visual C# > Pembuatan Aplikasi Client Server dengan Arsitektur 3-tier Part 2

Pembuatan Aplikasi Client Server dengan Arsitektur 3-tier Part 2

February 5, 2012

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 ?😛

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😀 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🙂

  1. dimas
    February 17, 2012 at 3:01 pm

    PR postingan berikutnya apa sudah diselesaikan pak😀

    • February 17, 2012 at 3:43 pm

      Belum om, lagi nyelesain PR yg lainnya😀

  2. April 18, 2012 at 9:04 pm

    saya ga ngerti itu MarshallByRefObject darimana om..dibuat sendiri atau gimana class nya?

  3. April 18, 2012 at 9:10 pm

    akbar :
    saya ga ngerti itu MarshallByRefObject darimana om..dibuat sendiri atau gimana class nya?

    udah ketemu omm.. maaf ya bawell hahaha

    • April 19, 2012 at 4:48 pm

      Oke om sipp🙂

      • April 24, 2012 at 11:51 am

        om untuk password nya saya ga tau .. dikasi blank juga gabisa… failed for user ‘sa’:/

  4. CHESSi
    February 28, 2013 at 1:47 pm

    om mau nanya nich gak ada kaitan ama judul diatas..sy dpat s/w dari link ini

    http://www.4shared.com/file/VCG4Metd/Installer_Aplikasi_Buku_Kas_By.htm

    tp masalhnya invalid database katanya..cara bikin database untuk s/w tsb gmn..ato cara supaya bisa jalan s/w tsb gmn..sorry om soalnya blm ngerti klo dach msk ke area ini mah..terima ksh om..klo bisa di dikirim ke emailku saja om..!!

    • February 28, 2013 at 3:36 pm

      Linknya enggak bisa didownload om

      • CHESSi
        March 1, 2013 at 11:24 am

        masa om..tp knapa saya bisa kmaren downloadnya..klo gak saya kirim s/w nya via email om..tolong kirim email pnya om..ke email sy : comma_c@yahoo.com..terima ksh banyak om sblmnya..!!

        • March 1, 2013 at 2:05 pm

          Sy udah coba install dan berhasil hanya saja ada datanya yg error sehingga tetap tidak bisa login.

          Lagian programnya juga masih trial kok.

          • CHESSi
            March 1, 2013 at 8:58 pm

            oh brarti memang datanya yg error ya om..ya udach makasih om atas sarannya..paling nanti sy coba searching yg lain..!!

            • March 2, 2013 at 9:18 am

              Oke om sama2x

  5. fajar
    March 1, 2013 at 3:41 pm

    om saya buat interface seperti ini

    Public Interface DataObject

    Sub ExeClass(ByVal Period As String)

    End Interface

    waktu implement, yg terjadi error
    lalu saya rubah.

    Public Interface DataObject

    Sub ExeClass() ‘tambahan
    Sub ExeClass(ByVal Period As String)

    End Interface

    apa memang harus ada sub tanpa parameter ya om di interface?

    Terima kasih

    • March 1, 2013 at 3:50 pm

      Ya harusnya walaupun cuma ada method ExeClass(ByVal Period As String) interfacenya tetap jalan.

      Memangnya sebelum ditambah method Sub ExeClass() pesan errornya apa om ?

  6. Mister PB
    May 6, 2013 at 7:37 pm

    Sepertinya panjang ya cara buatnya beda dengan Powerbuilder hanya beberapa setting aplikasi 3 tier sudah bisa dipake, contoh aplikasi yang pake 3 tier dengan Powerbuilder itu aplikasi bank Daerah contoh Bank Bali, Bank Sumut, Bank Papua dll tapi menurut saya bagus juga pak, sebagian orang 3 tier itu masih awam karena kebanyakan itu model 2 tier atau klient server yang biasa di pake di perusahaan.

    • May 7, 2013 at 9:19 am

      Sebenarnya sih enggak juga om, intinya belum terbiasa aja. Apalagi di kampus2x juga biasanya memang lebih sering dibahas aplikasi klien server yg menggunakan 2-tier.

      Wah sy jadi penasaran nih PowerBuilder itu seperti apa ?😀

  7. Mister PB
    May 7, 2013 at 8:37 pm

    Kalau website resminya di http://www.sybase.com sekarang udah di beli sama SAP kalau forum indo di http://www.kaskus.co.id/thread/000000000000000004853867/belajar-pemrograman-powerbuilder/ dan http://www.indopb.com/ kalau perusahaan indonesia yang pake banyak salah satunya http://www.collega.co.id terutama yang pake konsep 3 tier karena buat bank yang cabangnya ada di mana-mana

    • May 8, 2013 at 8:52 am

      Oke om, tq infonya🙂

  1. No trackbacks yet.
Comments are closed.
%d bloggers like this: