Apakah ada kebutuhan untuk kelas pabrik untuk membuat model viewm?

17

Seorang kolega saya menyarankan menggunakan kelas pabrik untuk membuat objek viewmodel dalam solusi ASP.NET MVC kami. Gagasannya adalah dapat membantu desain, dan rawatan, dari cara viewmodels dibangun di aplikasi kami.

Saya ingin mencari tahu apakah ada orang lain yang memiliki pengalaman ini. Saya telah melakukan beberapa penelitian dan menemukan sangat sedikit pada praktik ini.

Saat ini kami membuat objek viewmodel di tingkat controller misalnya

public ActionResult Index()
{
    return this.View(this.BuildIndexViewModel());
}

Jadi this.BuildIndexViewModel () bertanggung jawab untuk membuat kelas viewmodel (jelas :). Tapi kami sedang mencari kemungkinan:

public ActionResult Index()
{
    return this.View(ViewModelFactory.CreateIndexViewModel());
}

Ini ide yang menarik, tapi saya tidak 100% yakin. Saya tertarik pada pendapat orang lain tentang ini.

Jason Evans
sumber
4
Saya berjuang untuk melihat manfaatnya jujur. Anda akan menggunakan pabrik untuk menyembunyikan konstruksi objek, tetapi mengapa Anda dalam hal ini?
CodeART
3
Metode BuildIndexViewModel Anda sudah merupakan metode pabrik, yang sifatnya privat bagi pengontrol. Satu-satunya alasan untuk mengekstrak itu ke kelas pabrik yang berbeda adalah untuk menggunakannya kembali di pengontrol lain.
MattDavey
Kalian berdua memiliki pemikiran yang sama dengan saya dalam hal ini, jadi saya senang saya tidak sendirian :) @MattDavey Saya bisa jujur ​​mengatakan saya sangat meragukan bahwa viewmodels akan digunakan dengan lebih dari satu controller, yang membuat pabrik ide berlebihan. Saya akan membagikan ini ketika topik muncul lagi di tempat kerja.
Jason Evans
Secara pribadi saya lebih suka tipe viewmodel untuk menjadi ahli dalam proses membangun itu sendiri. Satu-satunya waktu keahlian harus diletakkan di tempat lain adalah jika konstruksi membutuhkan pengetahuan tentang area aplikasi lain (mis. Repositori), dalam hal ini Anda mungkin ingin seorang perantara menjaga agar model tampilan tetap bodoh :)
MattDavey
@MattDavey: Bisakah Anda membungkus kedua komentar itu menjadi jawaban yang dapat saya jawab?
pdr

Jawaban:

8

Dalam hal ini saya akan mengatakan pedoman terbaik untuk diikuti adalah prinsip-prinsip GRASP . Secara khusus melihat empat kriteria menugaskan pembuatan objek:

Secara umum, kelas B harus bertanggung jawab untuk membuat instance kelas A jika satu, atau lebih disukai, dari yang berikut ini berlaku

  • Mesin virtual B berisi atau secara gabungan menggabungkan mesin virtual A
  • Contoh dari B merekam instance dari A
  • Contoh B sangat dekat menggunakan contoh A
  • Mesin virtual B memiliki informasi awal untuk mesin virtual A dan meneruskannya saat pembuatan.

Kelas pengontrol Anda (B) cocok dengan item # 3 & # 4 dari daftar itu (dan # 2 jika viewmodel dikembalikan), jadi itu sudah tempat yang sangat masuk akal untuk perilaku konstruksi viewmodel (A) untuk hidup. Seperti yang saya lihat, hanya ada dua alasan yang memaksa saya untuk mengekstrak perilaku konstruksi itu ke dalam kelas spesialis.

  • KERING - Jika dua atau lebih pengontrol perlu berbagi perilaku konstruksi viewmodel, mengenkapsulasinya dalam komponen yang berbeda akan memfasilitasi penggunaan kembali kode dan menghindari duplikasi.
  • Jika perilaku konstruksi memiliki ketergantungan pada komponen sistem lain seperti repositori, validator, dll, dan Anda tidak ingin memperkenalkan kopling ini ke controller itu sendiri (dalam istilah GRASP, fabrikasi murni).

Melihat kembali ke 4 kriteria penciptaan objek di GRASP, saya hanya akan mengekstrak perilaku ke pabrik terpisah jika itu memberi saya centang tambahan pada daftar itu. Kalau tidak, tidak akan ada gunanya melakukannya.

Semoga itu bisa membantu!

MattDavey
sumber