[Shared].NET Remoting Object Dengan C# Part 3

Forum diskusi pemrograman Visual C# .NET

[Shared].NET Remoting Object Dengan C# Part 3

Postby k4m4r82 » 01 Jan 2012, 17:29

Masih melanjutkan trit yg sebelumnya tentang .NET Remoting, sengaja dipisah biar lebih fresh \:D/

Kali ini kita akan mengimplementasikan .NET Remoting pada pembuatan aplikasi database, tapi sebelumnya kita lihat dulu kenapa kok report2x menggunakan .NET Remoting untuk pembuatan aplikasi database karena katanya "orang yang tidak tau itu cendrung memusuhi" halah :D.

Arsitektur Klien Server 2 tier
Sadar atau enggak aplikasi yang kita buat selama ini mungkin lebih banyak (semua malahan :D) masuk kategori ini. Kok tau ?

Image

Dari gambar diatas terlihat semua aplikasi klien membuat koneksi ke server database, semakin banyak aplikasi kliennya tentu akan berpengaruh pada kinerja database, apalagi klo rule bisnisnya langsung diletakkan di klien jika ada perubahan otomatis harus mengupdate semua klien #:-s

Arsitektur Klien Server 3 tier

Image

Untuk yg 3 tier sebanyak apapun aplikasi kliennya tidak terlalu bermasalah karena yang terkoneksi ke database hanya satu yaitu aplikasi server, paling-paling spek mesin servernya aja yg dinaikin :D

Klo pengen lebih ngirit untuk aplikasi server bisa satu mesin dengan database, selain itu rule bisnis biasanya diletakkan disini, sehingga jika terjadi perubahan cukup mengupdate disatu tempat.

Nah berdasarkan 2 pertimbangan diatas, mungkin sudah muncul motivasi untuk mencoba .NET Remoting dalam pengembangan aplikasi database... klo iya silahkan lanjutkan membacanya :D

Untuk kasus project yg akan kita buat sederhana saja yaitu aplikasi SmartLibrary (SI Perpus) tentunya tidak semua :D kita ambil contoh pengolahan data buku dan penerbit, selain itu untuk alasan kemudahan databasenya cukup menggunakan Ms Access.

Oke sebelumnya kita lihat dulu project SmartLibrary yang akan kita bangun.

1. SmartLibraryLib
SmartLibraryLib dibuat dengan memanfaatkan project bertipe Class Library yang isinya hanya berupa interface IDao dan class Model.

Project ini nantinya akan dicompile menjadi file dengan ekstensi .dll (SmartLibraryLib.dll), file SmartLibraryLib.dll ini akan dishare atau ditambahkan sebagai referensi untuk aplikasi SmartLibraryServer dan SmartLibraryKlien.

Teknik ini dikenal dengan istilah “Shared Assembly” tujuannya adalah agar aplikasi server dan klien bisa berkomunikasi dengan cara yang sama.

2. SmartLibraryServer
SmartLibraryServer dibuat dengan memanfaatkan project bertipe Console Application, implementasi aslinya biasanya aplikasi server dijadikan sebuah service (Windows Service). Aplikasi ini nantinya akan mengimplementasikan semua method-method abstract dari project SmartLibraryLib.

3. SmartLibraryKlien
Terakhir SmartLibraryKlien dibuat dengan memanfaatkan project bertipe Windows Application isinya berupa Form dan Report, aplikasi ini hanya memanggil method-method abstract dari project SmartLibraryLib dengan memanfaatkan objek proxy sehingga method tersebut akan dieksekusi secara remote (dijalankan di sisi server).

Berikut gambaran project yang akan kita bangun.

Image

Project diatas sangat mirip dengan sample project Calculator yang sudah saya bahas disini.

Sesuai urutan kita akan membuat project SmartLibraryLib terlebih dulu dan sebagai gambaran apa saja yang ada didalam project SmartLibraryLib ini bisa kita lihat dari class diagram berikut :

Image

Dari class diagram diatas terlihat bahwa SmartLibraryLib hanya terdiri dari Interface Dao dan Class Model (pada trit ini hanya dibahas pengolahan data buku dan penerbit).

Interface IDao merupakan interface generic yang berisi method-method abstract CRUD yang akan diturunkan oleh interface IBukuDao dan IPenerbitDao.

Untuk class Model merupakan representatif dari tabel-tabel yang ada di database dalam ini tabel buku dan penerbit.

Oke kita langsung saja membuat project ini.

Membuat Project SmartLibraryLib

1. Klik menu File ->New -> Project …

Image

2. Pada dialog New Project aktifkan pilihan Visual C# kemudian pada pilihan Templates pilih Class Library

Image

Pada isian Name isikan SmartLibraryLib, setelah itu klik tombol Ok.

Secara default pada saat pembuatan project sudah otomatis disediakan 1 buah class kosong dengan nama Class1, kita akan menambahkan class baru jadi class ini dihapus saja.

Image

Menambahkan Folder IDao dan Model

Tujuannya untuk mengelompokkan interface dao dan class model

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

Image

Image

Kemudian untuk nama folder diganti dengan IDao. Ulangi langkah sebelumnya untuk menambahkan folder Model.
Hasil akhir sementara

Image

Menambahkan Class Model

Kita akan menambahkan class model Buku dan Penerbit

Image

Semua class model akan kita tempatkan di dalam folder Model.

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

Image

Untuk isian Name diisi Buku.

Image

Setelah itu akan tampil editor code class Buku

Image

Jangan lupa untuk menambahkan access modifier public.

Berikut kode lengkap untuk class Buku.

Code: Select all
namespace SmartLibraryLib.Model
{
    [Serializable]
    public class Buku
    {
        private string _iSBN;
        public string ISBN
        {
            get { return _iSBN; }
            set { _iSBN = value; }
        }

        private string _judul;
        public string Judul
        {
            get { return _judul; }
            set { _judul = value; }
        }

        private string _edisi;
        public string Edisi
        {
            get { return _edisi; }
            set { _edisi = value; }
        }

        private string _bahasa;
        public string Bahasa
        {
            get { return _bahasa; }
            set { _bahasa = value; }
        }

        private Penerbit _penerbit;
        public Penerbit Penerbit
        {
            get { return _penerbit; }
            set { _penerbit = value; }
        }
    }
}

Satu hal yang penting disini adalah objek/instance dari class Buku akan diserialisasikan dari server ke klien atau sebaliknya sehingga harus ditambahkan atribut [Serializable].

Image

Ulangi langkah diatas untuk menambahkan class Penerbit. Berikut kode lengkap class Penerbit

Code: Select all
namespace SmartLibraryLib.Model
{
    [Serializable]
    public class Penerbit
    {
        private int _penerbitID;
        public int PenerbitID
        {
            get { return _penerbitID; }
            set { _penerbitID = value; }
        }

        private string _nama;
        public string Nama
        {
            get { return _nama; }
            set { _nama = value; }
        }
    }
}

hasil sementara

Image

Menambahkan Interface IDao

Kita akan menambahkan interface IDao, IBukuDao dan IPenerbitDao

Image

Dari diagram diatas terlihat bahwa IDao merupa interface induk dari interface IBukuDao danIPenerbitDao.

IDao sendiri merupakan interface generic yang mempunyai method abstract CRUD secara umum, sehingga interface IBukuDao danIPenerbitDao tinggal menambahkan method-method abstract yang menjadi spesialisasinya masing-masing.

Semua interface IDao akan kita tempatkan di dalam folder IDao.

1. Klik kanan folder IDao -> Add -> New Item…

Image

2. Pada pilihan template pilih Interface kemudian untuk isian Name diisi IDao.

Image

Setelah itu akan tampil editor code interface IDao

Image

Jangan lupa untuk menambahkan access modifier public.

Selanjutnya kita tinggal menambahkan 5 method abstractnya yaitu Save, Update, Delete, GetAll dan GetReportAll sesuai class diagram diatas.

Berikut kode lengkapnya

Image

Ulangi langkah sebelumnya untuk menambahkan interface IBukuDao dan IPenerbitDao.

Berikut kode lengkap interface IBukuDao dan IPenerbitDao

Image

Image

Pada interface IBukuDao dan IPenerbitDao diatas membutuhkan namespace SmartLibraryLib.Model karena sebagian method abstractnya mengakses class model.

Mengcompile project SmartLibraryLib

Tujuannya adalah agar project SmartLibraryLib ini bisa digunakan sebagai referensi oleh project SmartLibraryServer dan SmartLibraryKlien

1. Klik kanan project SmartLibraryLib -> Build

Image

Image

Setelah itu akan tampil hasil output dari proses Build

Akhirnya selesai juga #:-s

Insya Allah akan berlanjut

Selamat mencoba :)

Post k4m4r82 telah mendapat 4 kopi dari:
ariartama, pujanggabageur, trail, vberror13
User avatar
k4m4r82
Java Moderator
Java Moderator
 
Posts: 1092
Joined: 14 Mar 2010, 12:40
Location: Utara Fak. Teknik UGM tepatnya di daerah Pogung
Memberi kopi: 33 cangkir
Mendapat kopi: 123 cangkir

Re: [Shared].NET Remoting Object Dengan C# Part 3

Postby ariartama » 02 Jan 2012, 12:53

Om Kamar, saya menunggu kelanjutannya..
Mantabz pokonya nih, ilmu baru buat ane..
Silahkan yang mau memperpanjang tali silaturahmi :
http://www.facebook.com/ariartama
User avatar
ariartama
Kopral Dua
Kopral Dua
 
Posts: 645
Joined: 06 May 2010, 18:59
Location: Sondari.com
Memberi kopi: 34 cangkir
Mendapat kopi: 60 cangkir

Re: [Shared].NET Remoting Object Dengan C# Part 3

Postby k4m4r82 » 07 Jan 2012, 12:23

ariartama wrote:Om Kamar, saya menunggu kelanjutannya..

Oke om kita lanjut ... :)

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

SmartLibraryServer dibuat dengan memanfaatkan project bertipe Console Application yang isinya hanya berupa class DAO (Data Access Object) :

Image

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

Image

kita akan menambahkan project SmartLibraryServer masih di solution yang sama

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

Image

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

Image

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

Image

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

Image

Image

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.

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

Image

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

Image

2. Untuk isian Name diisi BukuDao.

Image

Setelah itu akan tampil editor code class BukuDao

Image

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 buat pada project 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…

Image

2. Aktifkan tab Projects kemudian pilih project SmartLibraryLib

Image

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

Image

Selanjutnya kita mulai melengkapi kode dari class BukuDao.

Image

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

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

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.

Image

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

Image

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

Code: Select all
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.

Code: Select all
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;
}

Code: Select all
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;
}

Code: Select all
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();
    }
}

Code: Select all
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();
    }
}

Code: Select all
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();
    }
}

Code: Select all
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;
}

Code: Select all
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

Image

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 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.

Image

kemudian pada isian New method name isikan MappingDtrToObject

Image

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

Image

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

Image

Untuk sementara project SmartLibraryServer kita cukupkan dulu sampe disini #:-s masih ada beberapa kode yg belum terselesaikan 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.

Insya Allah akan dilanjut pada kesempatan berikutnya.

Selamat mencoba :)

Post k4m4r82 telah mendapat kopi dari:
ariartama
User avatar
k4m4r82
Java Moderator
Java Moderator
 
Posts: 1092
Joined: 14 Mar 2010, 12:40
Location: Utara Fak. Teknik UGM tepatnya di daerah Pogung
Memberi kopi: 33 cangkir
Mendapat kopi: 123 cangkir

Re: [Shared].NET Remoting Object Dengan C# Part 3

Postby vberror13 » 12 Jan 2012, 09:17

udah part 3 aja? ane terlambat nih. :-bd . artikelnya tambah mantap,oom. mudah-mudahan dikaruniai pahala yang melimpah. :)
:ymbilly: :ymbilly: :ymbilly: =:) :ymbilly:
Just Because You Are Unique, Doesn't Mean You Are Useful
User avatar
vberror13
Global Moderator
Global Moderator
 
Posts: 1848
Joined: 13 Mar 2010, 20:34
Location: Medan Indonesia
Memberi kopi: 296 cangkir
Mendapat kopi: 321 cangkir

Re: [Shared].NET Remoting Object Dengan C# Part 3

Postby dimasiano » 28 Feb 2012, 15:24

waiting for part 4 :-? i-)
tak ada coding yang sempurna tanpa bantuan rekan-rekan semua
User avatar
dimasiano
Prajurit Satu
Prajurit Satu
 
Posts: 61
Joined: 31 Aug 2010, 07:35
Location: surabaya
Memberi kopi: 3 cangkir
Mendapat kopi: 4 cangkir

Re: [Shared].NET Remoting Object Dengan C# Part 3

Postby k4m4r82 » 14 Mar 2012, 14:20

dimasiano wrote:waiting for part 4 :-? i-)

Ampunn om ^:)^ ^:)^ belum sempat :D
User avatar
k4m4r82
Java Moderator
Java Moderator
 
Posts: 1092
Joined: 14 Mar 2010, 12:40
Location: Utara Fak. Teknik UGM tepatnya di daerah Pogung
Memberi kopi: 33 cangkir
Mendapat kopi: 123 cangkir


Return to Visual C#

Who is online

Users browsing this forum: No registered users and 2 guests