Apakah objek Persistence-Ignorant mampu mengimplementasikan lazy loading?

12

Ketidaktahuan Ketekunan adalah penerapan prinsip tanggung jawab tunggal, yang dalam praktiknya berarti bahwa Objek Domain ( DO ) tidak boleh berisi kode yang terkait dengan kegigihan, alih-alih hanya berisi logika domain.

a) Saya menganggap ini berarti bahwa kode yang menghubungi lapisan bawah (yaitu lapisan persistensi) hidup di luar model domain di kelas lain ( OC ) dari lapisan logika bisnis?

b) Jika asumsi saya di bawah a) benar, maka DO , katakanlah Customer, tidak pernah berisi metode seperti GetCustomersatau GetCustomerByID?

c) Jika asumsi saya di bawah a) dan b) benar, dan dengan asumsi Customerobjek domain menggunakan lazy loading untuk beberapa propertinya, maka pada beberapa titik Customerlogika internal harus menghubungi OC , yang pada gilirannya mengambil data yang ditangguhkan. Tetapi jika Customerperlu menghubungi OC untuk menerima data yang ditangguhkan, maka kami tidak dapat benar-benar mengklaim bahwa Objek Domain tidak mengandung logika yang terkait dengan kegigihan ?!

Terima kasih

REPLYING TO jkohlhepp

1) Saya berasumsi OrderProviderdan CustomerProviderkelas terdapat dalam lapisan logika bisnis?

2) Saya mengumpulkan dari balasan Anda bahwa asumsi saya di bawah b) benar?

3)

... Saya akan memeriksa untuk melihat apakah beberapa bidang pesanan pribadi telah diisi atau jika itu nol. Jika itu nol ...

Tetapi sejauh yang saya tahu, segera setelah kode domain perlu memeriksa apakah orderbidang pribadi telah diisi, dan jika tidak, menghubungi OrderProvider, kami sudah melanggar prinsip PI ?!

pengguna1483278
sumber

Jawaban:

4

Saya percaya Anda benar dalam asumsi Anda A dan B di sekitar ketidaktahuan kegigihan.

Cara terbaik Anda untuk mencapai pemuatan objek database dengan malas sangat tergantung pada masalah dan implementasi Anda. Namun, saya akan mencoba jawaban umum tentang bagaimana melakukan pemuatan malas sambil tetap mempertahankan pemisahan kekhawatiran antara kelas logika domain dan persistensi.

Saya cenderung menerapkan ketidaktahuan kegigihan menggunakan kelas-kelas berikut:

  • Kelas domain - mis. Pelanggan
  • Kelas penyedia / repositori - mis. CustomerProvider
  • Kelas kueri basis data generik - mis. DatabaseQuery

Kelas DatabaseQuery akan bertanggung jawab untuk menggunakan driver database untuk query database dan mengumpulkan data yang dihasilkan ke dalam set hasil generik seperti DataTable. CustomerProvider akan bertanggung jawab untuk menggunakan kelas DatabaseQuery untuk mengeksekusi SQL terhadap database dan menggunakan hasil dari SQL itu untuk mengumpulkan contoh-contoh Pelanggan. Pelanggan akan menjadi objek domain "murni" yang berisi data dan logika yang terkait dengan pelanggan.

Adapun apakah kelas penyedia harus di tingkat bisnis atau tingkat data, saya tidak punya pendapat yang kuat. Saya bisa melihat kasing untuk keduanya. Bagian yang penting adalah Anda memisahkan tanggung jawab antar kelas.

Jadi sekarang mari kita bahas pemuatan malas. Katakanlah saya ingin Pelanggan memiliki koleksi Pesanan, tetapi saya tidak ingin menarik Pesanan dari database kecuali jika konsumen mencoba mengaksesnya. Saya akan membuat properti pada Pesanan yang disebut Pelanggan. Pada pengambil properti itu, saya akan memeriksa untuk melihat apakah beberapa bidang pesanan pribadi dihuni atau jika itu nol. Jika itu nol, muat pesanan dari database menggunakan OrderProvider. Jika tidak, kembalikan koleksi yang sudah dimuat.

Menurut pendapat saya, kebutuhan Pelanggan untuk menghubungi OrderProvider tidak melanggar PI. Pelanggan masih tidak tahu bagaimana cara mendapatkan pesanan. Itu hanya tahu bahwa itu mendapatkannya dari OrderProvider. Mungkin ada alasan lain untuk memisahkan Pelanggan dari OrderProvider, tapi saya rasa PI tidak menjadi masalah di sini.

Ini mengasumsikan bahwa Anda melakukan ketidaktahuan kegigihan secara manual. Jika Anda menggunakan kerangka kerja ORM seperti Entity Framework atau Hibernate, maka kerangka kerja tersebut biasanya memiliki fitur untuk mendukung pemuatan malas secara otomatis.

RasionalGeek
sumber
hai, jika Anda menemukan waktu - Saya telah mengedit posting saya sebagai jawaban atas jawaban Anda
user1483278
1
@ user1483278 Saya mengedit jawaban saya untuk mudah-mudahan menjawab pertanyaan-pertanyaan itu.
RationalGeek
Apa kepanjangan dari PI?
Kugel
Ketidaktahuan Ketekunan
RationalGeek
2

Anda hanya memiliki beberapa kelas wireup yang mengisi objek domain (katakanlah, sesuatu yang disebut "repositori"). Anda dapat menerapkan lazy loading atau apa pun jenis skema koherensi cache yang Anda inginkan dan objek domain tidak bijaksana. Anda memisahkan tanggung jawab untuk mengisi objek domain dari menjadi objek domain.

Erik Dietrich
sumber