Saya ingin mengajukan beberapa pertanyaan tentang praktik terbaik mengenai tipe pemetaan dan menggunakan metode ekstensi dalam C #. Saya tahu topik ini telah dibahas beberapa kali selama beberapa tahun terakhir, tetapi saya telah membaca banyak posting dan masih ragu.
Masalah yang saya temui adalah memperluas kelas yang saya miliki dengan fungsionalitas "convert". Katakanlah saya memiliki kelas "Person" yang mewakili objek yang akan digunakan oleh beberapa logika. Saya juga memiliki kelas "Pelanggan" yang mewakili respons dari API eksternal (sebenarnya akan ada lebih dari satu API, jadi saya perlu memetakan setiap respons API ke tipe umum: Orang). Saya memiliki akses ke kode sumber kedua kelas dan secara teoritis dapat menerapkan metode saya sendiri di sana. Saya perlu mengonversi Pelanggan ke Orang agar saya dapat menyimpannya ke basis data. Proyek tidak menggunakan pemetaan otomatis.
Saya memiliki 4 kemungkinan solusi dalam pikiran:
Metode ToTerson () di kelas konsumen. Ini sederhana, tetapi sepertinya mematahkan pola Tanggung Jawab Tunggal kepada saya, terutama bahwa kelas Konsumen dipetakan ke kelas lain (beberapa diperlukan oleh API eksternal lain) juga, jadi itu perlu mengandung beberapa metode pemetaan.
Memetakan konstruktor di kelas Person menggunakan Konsumen sebagai argumen. Juga mudah dan sepertinya juga melanggar pola Tanggung Jawab Tunggal. Saya perlu memiliki beberapa konstruktor pemetaan (karena akan ada kelas dari API lain, memberikan data yang sama dengan Konsumen tetapi dalam format yang sedikit berbeda)
Kelas konverter dengan metode ekstensi. Dengan cara ini saya dapat menulis metode .ToPerson () untuk kelas Konsumen dan ketika API lain diperkenalkan dengan kelas NewConsumer itu sendiri, saya hanya dapat menulis metode ekstensi lain dan menyimpan semuanya dalam file yang sama. Saya pernah mendengar pendapat bahwa metode penyuluhan adalah kejahatan pada umumnya dan harus digunakan hanya jika benar-benar diperlukan sehingga itulah yang menghambat saya. Kalau tidak, saya suka solusi ini
Kelas konverter / mapper. Saya membuat kelas terpisah yang akan menangani konversi dan menerapkan metode yang akan mengambil instance kelas sumber sebagai argumen dan mengembalikan instance kelas tujuan.
Singkatnya, masalah saya dapat dikurangi menjadi sejumlah pertanyaan (semua dalam konteks dengan apa yang saya jelaskan di atas):
Apakah memasukkan metode konversi ke dalam objek (POCO?) (Seperti metode .ToPerson () di kelas Konsumen) dianggap melanggar pola tanggung jawab tunggal?
Apakah menggunakan konstruktor konversi di (seperti DTO) dianggap melanggar pola tanggung jawab tunggal? Terutama jika kelas seperti itu dapat dikonversi dari beberapa jenis sumber, jadi beberapa konstruktor konversi akan diperlukan?
Apakah menggunakan metode ekstensi sambil memiliki akses ke kode sumber kelas asli dianggap praktik buruk? Bisakah perilaku seperti itu digunakan sebagai pola yang layak untuk memisahkan logika atau apakah itu anti-pola?
Person
kelas itu DTO? apakah itu mengandung perilaku?