Cara menggunakan Objek Transfer Data di ASP.NET Core 3.1

Objek Transfer Data (umumnya dikenal sebagai DTO) biasanya merupakan turunan dari kelas POCO (objek CLR biasa tua) yang digunakan sebagai wadah untuk merangkum data dan meneruskannya dari satu lapisan aplikasi ke yang lain. Anda biasanya akan menemukan DTO yang digunakan di lapisan layanan untuk mengembalikan data kembali ke lapisan presentasi. Keuntungan terbesar menggunakan DTO adalah memisahkan klien dari struktur data internal Anda.

Artikel ini membahas mengapa kita harus menggunakan Objek Transfer Data dan bagaimana kita dapat bekerja dengannya di ASP.NET Core 3.1. Untuk bekerja dengan contoh kode yang disediakan dalam artikel ini, Anda harus menginstal Visual Studio 2019 di sistem Anda. Jika Anda belum memiliki salinannya, Anda dapat mengunduh Visual Studio 2019 di sini. 

Buat proyek API ASP.NET Core 3.1

Pertama, mari buat proyek ASP.NET Core di Visual Studio. Dengan asumsi Visual Studio 2019 diinstal di sistem Anda, ikuti langkah-langkah yang diuraikan di bawah ini untuk membuat proyek ASP.NET Core API baru di Visual Studio.

  1. Luncurkan Visual Studio IDE.
  2. Klik "Buat proyek baru".
  3. Di jendela "Buat proyek baru", pilih "Aplikasi Web Inti ASP.NET" dari daftar templat yang ditampilkan.
  4. Klik Next. 
  5. Di jendela "Configure your new project", tentukan nama dan lokasi untuk proyek baru tersebut.
  6. Klik Buat. 
  7. Di jendela "Buat Aplikasi Web ASP.NET Core Baru" yang ditampilkan berikutnya, pilih .NET Core sebagai runtime dan ASP.NET Core 3.1 (atau yang lebih baru) dari daftar drop-down di bagian atas.
  8. Pilih "API" sebagai template proyek untuk membuat aplikasi ASP.NET Core API baru. 
  9. Pastikan kotak centang "Aktifkan Dukungan Docker" dan "Konfigurasi untuk HTTPS" tidak dicentang karena kami tidak akan menggunakan fitur tersebut di sini.
  10. Pastikan Autentikasi disetel sebagai "Tanpa Autentikasi" karena kami juga tidak akan menggunakan autentikasi.
  11. Klik Buat. 

Ini akan membuat proyek ASP.NET Core API baru di Visual Studio. Kami akan menggunakan proyek ini untuk bekerja dengan Objek Transfer Data di bagian selanjutnya dari artikel ini.

Mengapa menggunakan Objek Transfer Data (DTO)?

Saat mendesain dan mengembangkan aplikasi, jika Anda menggunakan model untuk meneruskan data di antara lapisan dan mengirim data kembali ke lapisan presentasi, Anda akan mengekspos struktur data internal aplikasi Anda. Itu adalah cacat desain utama dalam aplikasi Anda.

Dengan memisahkan lapisan Anda, DTO membuat hidup lebih mudah saat Anda mengimplementasikan API, aplikasi MVC, dan juga pola pesan seperti Message Broker. DTO adalah pilihan tepat ketika Anda ingin meneruskan objek ringan melintasi kabel - terutama saat Anda melewati objek melalui media yang dibatasi bandwidth.

Gunakan DTO untuk abstraksi

Anda dapat memanfaatkan DTO untuk mengabstraksi objek domain aplikasi Anda dari antarmuka pengguna atau lapisan presentasi. Dengan demikian, lapisan presentasi aplikasi Anda dipisahkan dari lapisan layanan. Jadi, jika Anda ingin mengubah lapisan presentasi, Anda dapat melakukannya dengan mudah sementara aplikasi akan terus bekerja dengan lapisan domain yang ada. Demikian pula, Anda dapat mengubah lapisan domain aplikasi Anda tanpa harus mengubah lapisan presentasi aplikasi.

Gunakan DTO untuk menyembunyikan data

Alasan lain Anda ingin menggunakan DTO adalah menyembunyikan data. Artinya, dengan menggunakan DTO Anda hanya dapat mengembalikan data yang diminta. Sebagai contoh, asumsikan Anda memiliki metode bernama GetAllEmployees () yang mengembalikan semua data yang berkaitan dengan semua karyawan. Mari kita ilustrasikan ini dengan menulis beberapa kode.

Dalam proyek yang kita buat sebelumnya, buat file baru bernama Employee.cs. Tulis kode berikut di dalam file ini untuk menentukan kelas model bernama Employee.

Kelas umum Karyawan

    {

        public int Id {get; set; }

        string publik FirstName {get; set; }

        string publik LastName {get; set; }

        public string DepartmentName {get; set; }

        desimal publik Dasar {get; set; }

        desimal publik DA {get; set; }

        HRA desimal publik {get; set; }

        desimal publik NetSalary {get; set; }

    }

Catatan kelas Karyawan berisi properti termasuk Id, FirstName, LastName, Department, Basic, DA, HRA, dan NetSalary. Namun, lapisan presentasi mungkin hanya membutuhkan Id, FirstName, LastName, dan Nama Departemen karyawan dari metode GetAllEmployees (). Jika metode ini mengembalikan Daftar, siapa pun akan dapat melihat detail gaji seorang karyawan. Anda tidak menginginkan itu. 

Untuk menghindari masalah ini, Anda mungkin mendesain kelas DTO bernama EmployeeDTO yang hanya berisi properti yang diminta (seperti Id, FirstName, LastName, dan Department Name).

Buat kelas DTO di C #

Untuk melakukannya, buat file bernama EmployeeDTO.cs dan tulis kode berikut di sana.

public class EmployeeDTO

    {

        public int Id {get; set; }

        string publik FirstName {get; set; }

        string publik LastName {get; set; }

        public string DepartmentName {get; set; }

    }

Sekarang setelah kelas model dan objek transfer data tersedia, Anda mungkin ingin membuat kelas konverter yang berisi dua metode: satu untuk mengonversi sebuah instance dari kelas model Employee menjadi sebuah instance dari EmployeeDTO dan (sebaliknya) satu untuk mengonversi sebuah instance dari EmployeeDTO ke sebuah instance dari kelas model Employee. Anda juga dapat memanfaatkan AutoMapper, pustaka pemetaan objek-ke-objek yang populer untuk memetakan dua jenis yang berbeda ini. Anda dapat membaca lebih lanjut tentang AutoMapper di sini.

Anda harus membuat Daftar di lapisan layanan aplikasi Anda dan mengembalikan koleksi ke lapisan presentasi.

Kekekalan DTO

DTO dimaksudkan untuk mengangkut data dari satu lapisan aplikasi ke lapisan lain. Konsumen DTO mungkin dibangun di .NET / C # / Java atau bahkan JavaScript / TypeScript. DTO sering kali dibuat berseri sehingga dapat independen dari teknologi yang digunakan di receiver. Dalam kebanyakan kasus, penerima data tidak perlu mengubah data tersebut setelah diterima - idealnya tidak!

Ini adalah contoh klasik tentang pentingnya kekekalan. Dan itulah mengapa DTO harus tetap!

Ada beberapa cara untuk mengimplementasikan DTO yang tidak dapat diubah di C #. Anda dapat menggunakan ReadOnlyCollection atau jenis koleksi tetap yang aman untuk thread yang ada di namespace System.Collections.Immutable. Anda dapat memanfaatkan jenis rekaman di C # 9 untuk mengimplementasikan DTO yang tidak dapat diubah juga.

Desain berbasis domain mengharapkan objek domain menjadi tidak dapat diubah secara eksternal. Ini adalah alasan yang bagus untuk membuat DTO Anda tidak berubah, bukan?

Tantangan serialisasi DTO

Anda harus dapat melakukan serialisasi / deserialisasi DTO dengan mulus sehingga dapat diteruskan melalui kabel. Namun dalam praktiknya, Anda mungkin harus menyelesaikan beberapa masalah serialisasi saat bekerja dengan DTO. Anda mungkin memiliki beberapa entitas atau kelas model dalam aplikasi dunia nyata dan masing-masing dapat memiliki referensi satu sama lain.

Katakanlah Anda telah membangun sistem manajemen kehadiran untuk karyawan di organisasi Anda. Biasanya, Anda mungkin memiliki kelas yang disebut Karyawan dalam aplikasi Anda yang mereferensikan kelas Pengguna (yaitu, Karyawan adalah pengguna aplikasi) yang pada gilirannya mereferensikan kelas Peran. Kelas Peran mungkin merujuk ke kelas Izin yang pada gilirannya mungkin merujuk kelas PermissionType dan PermissionGroup. Sekarang, ketika Anda membuat serial sebuah instance dari kelas Employee, Anda juga akan membuat serialisasi objek-objek ini. Sangat mudah untuk melihat bahwa, dalam beberapa kasus yang rumit, Anda mungkin akan membuat beberapa jenis serialisasi.

Di sinilah lazy loading atau asynchronous loading menjadi penyelamat. Ini adalah fitur yang dapat membantu Anda memuat entitas hanya ketika diminta. Untuk informasi lebih lanjut tentang cara melakukan pemuatan lambat, Anda dapat melihat artikel saya tentang inisialisasi malas di C #.

Objek Transfer Data biasanya tidak berisi logika bisnis apa pun - hanya berisi data. Kekekalan adalah fitur yang diinginkan saat bekerja dengan DTO. Ada beberapa cara untuk mengimplementasikan DTO yang tidak dapat diubah. Saya akan membahas lebih lanjut tentang kekekalan di C # di posting nanti di sini.

Cara melakukan lebih banyak di ASP.NET Core:

  • Cara menangani kesalahan 404 di ASP.NET Core MVC
  • Cara menggunakan injeksi ketergantungan dalam tindakan filter di ASP.NET Core 3.1
  • Cara menggunakan pola opsi di ASP.NET Core
  • Cara menggunakan perutean titik akhir di ASP.NET Core 3.0 MVC
  • Cara mengekspor data ke Excel di ASP.NET Core 3.0
  • Cara menggunakan LoggerMessage di ASP.NET Core 3.0
  • Cara mengirim email di ASP.NET Core
  • Cara memasukkan data ke SQL Server di ASP.NET Core
  • Cara menjadwalkan pekerjaan menggunakan Quartz.NET di ASP.NET Core
  • Cara mengembalikan data dari ASP.NET Core Web API
  • Cara memformat data respons di ASP.NET Core
  • Cara menggunakan ASP.NET Core Web API menggunakan RestSharp
  • Cara melakukan operasi asinkron menggunakan Dapper
  • Cara menggunakan tanda fitur di ASP.NET Core
  • Cara menggunakan atribut FromServices di ASP.NET Core
  • Cara bekerja dengan cookie di ASP.NET Core
  • Cara bekerja dengan file statis di ASP.NET Core
  • Cara menggunakan URL Rewriting Middleware di ASP.NET Core
  • Cara menerapkan pembatasan laju di ASP.NET Core
  • Cara menggunakan Azure Application Insights di ASP.NET Core
  • Menggunakan fitur NLog lanjutan di ASP.NET Core
  • Bagaimana menangani kesalahan di ASP.NET Web API
  • Bagaimana menerapkan penanganan pengecualian global di ASP.NET Core MVC
  • Bagaimana menangani nilai null di ASP.NET Core MVC
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara bekerja dengan layanan pekerja di ASP.NET Core
  • Cara menggunakan API Perlindungan Data di ASP.NET Core
  • Cara menggunakan middleware bersyarat di ASP.NET Core
  • Cara bekerja dengan status sesi di ASP.NET Core
  • Cara menulis pengontrol yang efisien di ASP.NET Core