Pembuatan Aplikasi Client Server dengan Arsitektur 3-tier Part 4

Posted by Kamarudin • 5 minute read • Comments

Melanjutkan postingan sebelumnya, tetapi kita akan review sedikit beberapa project yang sudah kita buat :

  1. SmartLibraryLib

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

Hasil compile project ini akan 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.

  1. SmartLibraryServer

SmartLibraryServer dibuat dengan memanfaatkan project bertipe Console Application, implementasi aslinya biasanya aplikasi server bisa dijadikan sebuah service (Windows Service) atau di hostnya menggunakan web service IIS.

Aplikasi inilah yang akan mengimplementasikan semua method-method abstract dari project SmartLibraryLib.

Adapun project penutup kita adalah SmartLibraryKlien, project ini dibuat  dengan memanfaatkan  project  bertipe  Windows Application  yang  isinya  hanya  berupa  Form  berikut  komponen-komponen pendukungnya (Label, TextBox, Button, ListView dll) :

Project  SmartLibraryKlien  tidak  langsung  mengakses  database  untuk  proses CRUDnya  melainnya  hanya  mengakses  objek-objek  dari project SmartLibraryServer secara remote, jadi  project  SmartLibraryServer  inilah  yang  sudah  menghandle  semua  proses CRUDnya.

Oke kita langsung saja mengaktifkan kembali solution SmartLibrarynya dimana didalamnya sudah terdapat project SmartLibraryLib dan SmartLibraryServer.

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

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

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

Jika langkah sebelumnya berhasil maka pada solution SmartLibrary akan ketambahan satu project baru yaitu SmartLibraryKlien.

Secara default pada saat pembuatan project dengan tipe Windows Application sudah otomatis disediakan 1 buah form kosong dengan nama Form1, kita akan menambahkan form baru jadi form ini dihapus saja.

Menambahkan folder View

Folder disini digunakan untuk mengelompokkan class sesuai dengan fungsinya, contoh kita akan menambahkan folder View yang di dalamnya terdapat class FrmBuku dan FrmAddEditBuku.

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

Menambahkan FrmBuku dan FrmAddEditBuku

  1. Klik kanan folder View -> Add -> Windows Form …

  2. Pada dialog Add New Item – SmartLibraryKlien, isikan FrmBuku pada isian Name

  3. Jika sudah berhasil menambahkan FrmBuku, ulangi langkah sebelumnya untuk menambahkan FrmAddEditBuku

Berikut hasil akhir sementara dari langkah-langkah sebelumnya

Setelah itu kita desain tampilkan FrmBuku dan FrmAddEditBuku seperti berikut :

Menambahkan Library SmartLibraryLib

Sama seperti aplikasi server (SmartLibraryServer) yang membutuhkan library SmartLibraryLib, aplikasi klien (SmartLibraryKlien) juga membutuhkan library ini, tujuannya adalah agar aplikasi server dan klien bisa berkomunikasi dengan cara yang sama.

Oke berikut langkah-langkahnya :

  1. Klik kanan folder References -> Add Reference…

  2. Aktifkan tab Projects kemudian pilih SmartLibraryLib

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

Sampai disini kita tinggal melengkapi kode FrmBuku dan FrmAddEditBuku.

Berikut ringkasan kodenya.

// namespace utk mengakses interface dao dan class model
using SmartLibraryLib.IDao;
using SmartLibraryLib.Model;

Kode diatas perlu ditambahkan agar FrmBuku bisa mengakses semua interface dan class model yang ada di dalam library SmartLibraryLib.

private IBukuDao bukuDao = null;

Objek bukuDao merupakan objek dari interface IBukuDao yang berfungsi sebagai proxy dari remote object class BukuDao.

Sebuah method jika dipanggil melalui objek proxy maka akan dieksekusi secara remote.

// constructor
public FrmBuku()
{
    InitializeComponent();

    string server = "localhost";
    string port = "1234";
    string uri = "SmartLibraryServer.BukuDao";

    string url = "tcp://" + server + ":" + port + "/" + uri;

    // mendapatkan proxy untuk remote object dari class BukuDao
    bukuDao = (IBukuDao)Activator.GetObject(typeof(IBukuDao), url);

    // tampilkan semua data buku
    LoadDataBuku();

}

Kode diatas adalah sebuah constructor dan seharusnya kita sudah tidak asing lagi dengan yang satu ini.

Constructor adalah method khusus yang akan dipanggil pada saat menciptakan objek dari sebuah class.

Penjelasan dari mana datangnya nilai locahost, 1234 dan SmartLibraryServer.BukuDao pada kode di atas bisa Anda lihat disini.

Menampilkan Data

// method untuk menampilkan data buku ke listview
private void FillToListView(bool addData, Buku buku)
{
    if (addData)
    {
        int noUrut = lvwBuku.Items.Count + 1;

        ListViewItem item = new ListViewItem(noUrut.ToString());
        item.SubItems.Add(buku.ISBN);
        item.SubItems.Add(buku.Judul);
        item.SubItems.Add(buku.Bahasa);
        item.SubItems.Add(buku.Edisi);
        item.SubItems.Add(buku.Penerbit.Nama);

        lvwBuku.Items.Add(item);
    }
    else
    {
        int row = lvwBuku.SelectedIndices[0];

        ListViewItem itemRow = lvwBuku.Items[row];
        itemRow.SubItems[2].Text = buku.Judul;
        itemRow.SubItems[3].Text = buku.Bahasa;
        itemRow.SubItems[4].Text = buku.Edisi;
        itemRow.SubItems[5].Text = buku.Penerbit.Nama;
    }
}

// method untuk menampilkan semua data buku
private void LoadDataBuku()
{
    lvwBuku.Items.Clear();

    List<Buku> daftarBuku = bukuDao.GetAll();
    foreach (Buku buku in daftarBuku)
    {
        FillToListView(true, buku);
    }
}

// method untuk menampilkan semua data buku berdasarkan judul
private void LoadDataBuku(string judul)
{
    lvwBuku.Items.Clear();

    List<Buku> daftarBuku = bukuDao.GetByName(judul);
    foreach (Buku buku in daftarBuku)
    {
        FillToListView(true, buku);
    }
}

Menyimpan dan Mengupdate Data

private void btnSimpan_Click(object sender, EventArgs e)
{
    int result = 0;

    Buku buku = new Buku();
    buku.ISBN = txtISBN.Text;
    buku.Judul = txtJudul.Text;
    buku.Bahasa = txtBahasa.Text;
    buku.Edisi = txtEdisi.Text;
    buku.Penerbit.PenerbitID = penerbitID[cmbPenerbit.SelectedIndex];

    if (this.addData) // data baru
    {
        result = bukuDao.Save(buku);
        if (result > 0)
        {
            ResetInput();
            txtISBN.Focus();
        }
        else
        {
            MessageBox.Show("Data buku gagal disimpan", "Peringatan", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }
    else
    {
        result = bukuDao.Update(buku);
        if (result > 0)
        {
            this.Close();
        }
        else
        {
            MessageBox.Show("Data buku gagal disimpan", "Peringatan", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
    }
}

Menghapus Data

private void btnHapus_Click(object sender, EventArgs e)
{
    if (lvwBuku.SelectedItems.Count > 0)
    {
        int row = lvwBuku.SelectedIndices[0];

        ListViewItem itemRow = lvwBuku.Items[row];

        Buku buku = new Buku();
        buku.ISBN = itemRow.SubItems[1].Text;
        buku.Judul = itemRow.SubItems[2].Text;

        string msg = "Apakah data buku '" + buku.Judul + "' ingin dihapus ?";
        if (MessageBox.Show(msg, "Konfirmasi", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
        {
            int result = bukuDao.Delete(buku);
            if (result > 0) // data barang berhasil dihapus
            {
                MessageBox.Show("Data buku berhasil dihapus", "Informasi", MessageBoxButtons.OK, MessageBoxIcon.Information);
                LoadDataBuku();
            }
            else
            {
                MessageBox.Show("Data buku gagal dihapus", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

    }
    else // data belum dipilih
    {
        MessageBox.Show("Data belum dipilih");
    }
}

Menjalankan dua project secara bersamaan

Secara defaut pada saat kita menjalankan program (F5) hanya satu project yang akan dijalankan dalam satu waktu, sedangkan untuk mencoba aplikasi ini kita harus menjalankan project SmartLibraryServer dan SmartLibraryKlin secara bersamaan.

Untuk merubah setting ini berikut langkah-langkahnya :

  1. Klik kanan solution -> Set Startup Projects

  2. Pada dialog Solution aktifkan pilihan Multiple startup projects kemudian atur urutan eksekusinya (server dulu kemudian klien)

Setelah itu kita bisa langsung menekan tombol F5

Pada gambar diatas terlihat setiap kali aplikasi klien mengakses method CRUD, prosesnya akan dijalankan di sisi server, ini dibuktikan dengan muncul pesan “Method dieksekusi di sisi server".

Selamat MENCOBA :blush:

Comments