Pola repositori dengan lapisan layanan - terlalu banyak pemisahan?


8

Saya memiliki situs MVC yang menggunakan pola repositori. Saya tidak merasa cukup menggunakan gaya MVC, jadi saya bersiap-siap untuk mendesain ulang sebagian. Tapi saya juga ingin melakukannya sehingga jika front-end berubah, akan lebih mudah untuk bertukar.

Inilah yang saya miliki saat ini

Model - beberapa model saya mengandung entitas / kelas saya secara langsung. (Model login berisi kelas Pelanggan, yang merupakan korelasi langsung dengan tabel tabel Pelanggan / repositori) Tampilan - beberapa pandangan saya mengandung pertanyaan repo - yaitu

_customerRepo.Query().FirstOrDefault(c => c.Login == User.Identity.Name);

Controllers - Bukan masalah besar di sini, controller memanggil beberapa pertanyaan repo, dan beberapa dari mereka juga menggunakan beberapa layanan untuk memanggil repo - yaitu

_customerService.GetAllCustomers()

yang memanggil

_customerRepo.Query().All();

Inilah pikiran saya:

1) Model harus berisi HANYA data yang perlu disajikan pada tampilan. Bahkan jika semua properti tabel / objek Pelanggan disajikan pada tampilan, mereka harus ditulis ulang ke model / kelas mereka sendiri sehingga tampilan tidak tahu apa-apa tentang arsitektur database atau objek backend

2) Tampilan seharusnya hanya mengakses objek model

3) (Dan di sinilah saya berjuang di jalan mana yang harus diambil)

a) Pengendali (atau di suatu tempat di sisi MVC, harus berupa kode yang mengubah data objek yang dikembalikan dari repo / layanan dan mengubahnya menjadi model. Saya berasumsi saya bisa menempatkan kode ini dalam konstruktor model. Tetapi saya ' Telah memperhatikan bahwa DI mengharapkan konstruktor kosong default jika ada kesalahan validasi

b) Pengendali memanggil antarmuka repo pada metode yang disebut dengan baik untuk mengambil data (yaitu _customerRepo.GetAllCustomers ()

c) HANYA Pengontrol mengakses lapisan layanan. Lapisan layanan kemudian adalah satu-satunya hal yang berinteraksi dengan lapisan repo.

Apakah saya mencoba mengekstrak model, pengontrol, layanan, lapisan repo terlalu banyak? Apakah lapisan serivces terlalu banyak karena bisa dilakukan oleh repo?

Apa pendekatan yang disarankan untuk mengubah objek / entitas bisnis ke model?


2
Jawaban saya untuk pertanyaan serupa: programmers.stackexchange.com/a/135751/4127
Eric King

1
@EricKing, inilah yang saya cari. Terima kasih! Saya mungkin akan memilih untuk menutup pertanyaan ini karena mungkin merupakan duplikat dari tautan yang Eric miliki.
ganders

Jawaban:


9

Ya, lapisan layanan adalah overhead jika Anda tidak memiliki logika bisnis di sana. Arsitektur berlapis terlihat seperti overhead ketika sebuah layer (dalam layanan case Anda) tidak melakukan banyak hal. Tapi arsitektur berlapis menyediakan kopling longgar Anda yang umumnya baik untuk mengadaptasi persyaratan di masa depan.

Jika Anda dapat menjamin bahwa Anda tidak perlu melakukan apa pun di lapisan layanan kecuali salinan data dari repo ke model maka Anda dapat menghapus lapisan layanan dalam desain Anda. Namun jika aplikasi Anda sederhana, Anda tidak perlu khawatir untuk menambahkan lapisan lain untuk kinerja atau alasan lain.

Secara pribadi saya akan menjaga lapisan layanan dan (tergantung pada teknologi) akan menerapkan lapisan DAO / Repositori generik.


Sudut pandang ini bertentangan dengan ddd di mana lapisan layanan menurut definisi tidak memiliki logika dan logika apa pun yang seharusnya ada di domain.
Esben Skov Pedersen

2
@EsbenSkovPedersen Ada lebih dari satu jenis "layanan" di DDD. Layanan infrastruktur, layanan Aplikasi, dan layanan Domain adalah beberapa. Meskipun layanan Infrastruktur dan Aplikasi tidak boleh berisi logika bisnis, layanan Domain dapat dan dilakukan.
Eric King

3

Tergantung pada repositori konkret Anda, tetapi secara umum, saya akan menambahkan lapisan layanan di atas repositori.

Bergantung pada implementasi repositori Anda, mereka mungkin spesifik untuk toko kegigihan Anda. Itu membuat pengujian lebih mudah juga dan mengarah ke arsitektur heksagonal, daripada arsitektur berlapis klasik (yang saya anggap menguntungkan), lihat https://blog.8thlight.com/uncle-bob/2012/08/13/the- clean-architecture.html .


Bagaimana mungkin layanan ini khusus untuk toko kegigihan? Abstraksi itu persis apa yang harus disediakan repositori. Jika repo Anda mengekspos eksekusi (sql), maka Anda salah melakukannya.
Eugene

-4

Untuk sedikit menjelaskan kepada Anda apa itu pengontrol: MVC kembali dari sejak kami memiliki mainframe dan aplikasi layar teks. Model adalah data pada mainframe, View adalah layar terminal dan Controller adalah keyboard (tekan # untuk memanipulasi model).

Banyak hal telah berubah karena saat ini kami menggunakan mouse dan tombol-tombol (untuk Mengontrol aplikasi) ditampilkan pada Tampilan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.