Cara membuat situs ASP.NET MVC modular

14

Saya sedang dalam tahap perencanaan untuk sistem intranet karyawan yang akan dibangun dengan ASP.NET MVC 4. Kami ingin situs terdiri dari "modul" yang terpisah, yang masing-masing menyediakan fitur yang berbeda: pesan, perubahan penggajian, dll. Saya ingin modul ini dapat diaktifkan atau dinonaktifkan pada waktu kompilasi. Beranda akan menampilkan semacam navigasi yang akan ditautkan ke setiap modul yang dimuat.

Sejauh ini mudah, tetapi saya tidak ingin fitur navigasi harus tahu tentang modul sebelumnya. Dengan kata lain, saya ingin modul dapat ditemukan secara dinamis; Saya ingin dapat menulis kode untuk modul baru dan kemudian memiliki tautan yang ditambahkan ke bilah navigasi tanpa ada perubahan kode di tempat lain di sumber. Setiap modul harus memiliki beberapa cara untuk mendaftarkan diri dengan bilah navigasi, dan - yang lebih penting - ini harus dilakukan untuk setiap modul saat dimuat.

Saya percaya bahwa ini menghalangi penggunaan Area MVC, karena itu dirancang untuk kasus ketika tata letak situs diketahui sebelumnya. MEF sepertinya mungkin tepat, meskipun orang tampaknya memiliki keberhasilan yang beragam dalam menggabungkan MEF dengan MVC. Apakah MEF sebenarnya cara untuk pergi ke sini, atau apakah ada cara yang lebih baik untuk mencapai apa yang saya butuhkan?

bdesham
sumber
Pertanyaan bagus, saya merasa solusi Anda mungkin akan berputar menggunakan refleksi. Anda masih dapat menggunakan area saat Anda membuat item, tetapi metode Anda dalam membangun menu perlu menggunakan refleksi untuk mendapatkan semua tipe Anda (untuk menghemat perubahan kode). Bagaimana jika mereka semua mengimplementasikan antarmuka IModule antarmuka yang sama. Anda kemudian bisa menemukan semua inheritants antarmuka untuk mendapatkan semua modul yang Anda butuhkan untuk nge-link ke, masalah kemudian adalah bagaimana sebenarnya yang Anda akan mengasosiasikan bahwa dengan link tanpa setiap data tambahan? Hmm plotnya menebal ...
mattytommo
1
Kedengarannya bagi saya seperti Anda ingin membangun CMS, kecuali bahwa alih-alih melakukan administrasi CMS dari dalam CMS, Anda ingin itu dilakukan pada waktu membangun. Yang mengarahkan saya ke pertanyaan, mengapa Anda ingin itu dilakukan saat membangun?
James P. Wright
@ JamesP.Wright Yah, alasan saya ingin melakukannya pada waktu membangun adalah hanya karena sepertinya itu akan lebih sederhana daripada mengekspos fungsi ini melalui halaman di situs. (Plus, set modul yang digunakan akan berubah cukup jarang sehingga penambahan overhead dari pemilihan dinamis semacam ini tidak diperlukan.) Tapi sebenarnya, yang lebih penting daripada memilih modul saat membangun adalah kemampuan aplikasi untuk menemukan modul dalam tempat pertama, yang lebih merupakan dorongan pertanyaan saya.
bdesham
nopCommerce ( nopcommerce.com/documentation.aspx ) sebagian merupakan contoh yang baik dari yang Anda inginkan. Lihatlah cara menulis plugin dan pendekatannya untuk DI.
Rui Marques
Untuk tujuan penelitian saya ingin tahu apa 'kesuksesan campuran' dalam menggabungkan MEF dengan MVC. Karena codeplex adalah "Tinggal di arsip" saat ini, tautan yang disediakan OP tidak berfungsi lagi. Untuk menyisihkan waktu kepada orang lain: cari dengan ctrl + f untuk 'MEF2 dengan MVC4 via Microsoft.Composition' pada tab diskusi di archive.codeplex.com/?p=mef ;)
Kevin

Jawaban:

4

Pertama-tama saya akan memiliki kelas terpusat yang digunakan untuk aplikasi untuk mendaftarkan modul yang dikompilasi dengan konstruktor statis dan Daftar anggota statis modul yang ada di sistem. Modul akan memiliki properti statis yang menunjukkan apakah item menu atau tidak dan urutan apa yang akan muncul di menu.

Setiap modul akan memiliki konstruktor statis sendiri yang akan mencatat sendiri di kelas terpusat yang melacak modul.

Pikirkan sistem ini lebih seperti sistem jam waktu di mana karyawan masuk dan jam masuk. Kemudian pada waktu penggajian, kita tahu untuk membayar semua karyawan berdasarkan siapa yang masuk, dll.

Refleksi juga dapat digunakan jika Anda memiliki kontrak antarmuka pada modul yang harus mereka warisi dari yang menghubungkan info properti meta dengan modul tersebut.

Saya bekerja untuk Warner Brothers Music dan melakukan sistem pemrosesan musik internal untuk berbagai format penyandian. Saya membuat model plugin generik untuk pengkodean dengan refleksi yang menggunakan pewarisan sehingga bisa menjadi typecast dengan refleksi untuk mendapatkan properti meta dasar kelas. Saya belum mencoba menggunakan kelas terpusat statis. Hanya memikirkan itu secara acak sebagai cara lain untuk mencoba bersenang-senang.

Saya juga akan menambahkan bahwa saya telah menggunakan MVC yang melayani banyak klien dengan persyaratan awal tetapi juga dengan fitur yang ditingkatkan mirip dengan apa yang Anda coba lakukan. Sebaliknya saya mengkonversi MVC menjadi menggunakan App_Code daripada membutuhkan kompilasi. Lebih mudah mendorong file keluar dengan cara ini tanpa perlu kompilasi terpusat.

Anda dapat memanfaatkan JIT dengan dorongan FTP atau GIT sederhana daripada harus mengkompilasi secara lokal dan mendorong DLL.

Berikut ini tautan ke artikel tersebut pada stack overflow

Jason Sebring
sumber
Kedengarannya mirip dengan apa yang saya bayangkan. Satu-satunya masalah adalah, bagaimana cara mendapatkan modul dimuat di tempat pertama? Dengan mekanisme apa saya memberitahu mereka masing-masing untuk mendaftarkan diri ke kelas pusat? Di sinilah MEF sepertinya cocok.
bdesham
MEF lebih baik. Saya memberikan ide tanpa melihat ke dalamnya tapi saya akan menggunakan MEF yang diberikan opsi itu jika itu keluar ketika saya melakukan proyek-proyek itu. Sepertinya itu ide yang bagus. Saya tidak mengerti mengapa Anda tidak bisa menggabungkan MEF dan MVC.
Jason Sebring