Memilih antara MEF dan MAF (System.AddIn)

162

Managed Extensibility Framework (MEF) dan Managed AddIn Framework (MAF, alias System.AddIn) tampaknya menyelesaikan tugas yang sangat mirip. Menurut pertanyaan Stack Overflow ini, Apakah MEF pengganti untuk System.Addin? , Anda bahkan dapat menggunakan keduanya secara bersamaan.

Kapan Anda memilih untuk menggunakan satu vs yang lain? Dalam keadaan apa Anda akan memilih untuk menggunakan keduanya bersama-sama?

dthrasher
sumber

Jawaban:

131

Saya telah mengevaluasi opsi-opsi ini dan inilah kesimpulan yang saya dapatkan.

MAF adalah kerangka addon yang benar. Anda dapat memisahkan addons sepenuhnya, bahkan menjalankannya di dalam domain aplikasi terpisah sehingga jika addon mogok, itu tidak akan menghapus aplikasi Anda. Ini juga menyediakan cara yang sangat lengkap untuk memisahkan dari addons dari tergantung pada apa pun kecuali kontrak yang Anda berikan kepada mereka. Bahkan, Anda dapat membuat versi dari adapter kontrak Anda untuk memberikan kompatibilitas ke belakang ke addons lama saat Anda meningkatkan Aplikasi utama. Walaupun ini terdengar hebat, ia datang dengan harga yang harus Anda bayar untuk melintasi appdomains. Anda membayar harga ini dalam kecepatan dan juga fleksibilitas jenis yang dapat Anda kirim bolak-balik.

MEF lebih seperti injeksi ketergantungan dengan beberapa manfaat tambahan seperti dapat ditemukan dan ... (mengosongkan yang ini). Tingkat isolasi yang dimiliki MAF tidak ada dalam MEF. Mereka adalah dua kerangka kerja yang berbeda untuk dua hal yang berbeda.

Danielg
sumber
5
satu hal kecil: harap diingat bahwa 'appdomain terpisah' TIDAK membantu Anda jika addon Anda mogok di lapisan asli, untuk itu Anda masih akan memerlukan proses pekerja. MAF sedikit membantu menciptakannya, tetapi pulih secara dinamis dari kecelakaan seperti itu masih cukup sulit (tapi mungkin)
quetzalcoatl
@Ian: tolong baca kembali komentar saya :) Saya sudah menulis itu, dan LEBIH: MAF benar-benar mengizinkannya, tetapi Anda harus bangun setelah kecelakaan itu sendirian.
quetzalcoatl
@DanielG> ia datang dengan harga yang harus Anda bayar untuk menyeberangi appdomains <Kenapa ini? Seberapa berat'?
Martin Meeser
2
@MartinMeeser Saat melintasi domain aplikasi Anda harus membuat serialisasi semua atau menggunakan objek MarshalByRef. Komunikasi jauh lebih sulit daripada berbicara antara objek di domain aplikasi yang sama.
Danielg
65

Apa yang dikatakan Danielg baik. Saya akan menambahkan:

Jika Anda menonton video tentang System.Addins, mereka jelas berbicara tentang proyek yang sangat besar. Dia berbicara tentang satu tim yang mengelola aplikasi host, tim lain yang mengelola setiap AddIn, dan tim ketiga yang mengelola kontrak dan saluran pipa. Berdasarkan itu, saya pikir System.Addins jelas untuk aplikasi yang lebih besar. Saya sedang memikirkan aplikasi seperti sistem ERP seperti SAP (mungkin tidak sebesar itu, tetapi Anda mendapatkan idenya). Jika Anda menonton video-video itu, Anda dapat mengatakan bahwa jumlah pekerjaan untuk menggunakan System.Addins sangat besar. Ini akan bekerja dengan baik jika Anda memiliki banyak perusahaan yang memprogram add-in pihak ke-3 untuk sistem Anda dan Anda tidak dapat memutus salah satu dari kontrak add-in itu di bawah hukuman mati.

Di sisi lain, MEF tampaknya berbagi lebih banyak kesamaan dengan skema add-in SharpDevelop, arsitektur plugin Eclipse atau Mono.Addins. Ini jauh lebih mudah dipahami daripada System.Addins dan saya percaya itu jauh lebih fleksibel. Hal-hal yang Anda hilangkan adalah Anda tidak mendapatkan isolasi AppDomain atau kontrak versi yang kuat dengan MEF. Kekuatan MEF adalah bahwa Anda dapat menyusun seluruh aplikasi Anda sebagai komposisi bagian, sehingga Anda dapat mengirimkan produk Anda dalam konfigurasi yang berbeda untuk pelanggan yang berbeda, dan jika pelanggan membeli fitur baru, Anda cukup memasukkan bagian untuk fitur itu ke dalam direktori pemasangan mereka. dan aplikasi melihatnya dan menjalankannya. Ini juga memfasilitasi pengujian. Anda dapat instantiate objek yang ingin Anda uji dan memberi makan objek tiruan untuk semua dependensinya,

Poin paling penting yang ingin saya sebutkan adalah meskipun System.Addins sudah ada dalam framework, saya tidak melihat banyak bukti orang menggunakannya, tapi MEF hanya duduk di sana di CodePlex yang seharusnya dimasukkan dalam .NET 4, dan orang-orang sudah mulai membangun banyak aplikasi dengannya (termasuk saya sendiri). Saya pikir itu memberi tahu Anda sesuatu tentang dua kerangka kerja.

Scott Whitlock
sumber
1
"Jika Anda menonton video tentang System.Addin", Video apa? Bisakah Anda memberikan tautannya? Terima kasih
jimjim
1
@Arjang - ada pasangan di Channel 9. Coba channel9.msdn.com/Blogs/DanielMoth/Managed-AddIn-Framework
Chris Spicer
60

Setelah mengembangkan dan mengirim aplikasi MAF. Pandangan saya tentang MAF agak payah.

MAF adalah sistem "de-coupled" atau sistem "longgar-coupled" paling buruk. MEF adalah sistem "digabungkan" atau "pasangan longgar" sistem yang terbaik.

Manfaat MAF yang kami sadari dengan menggunakan MAF adalah:

  1. Menginstal baru atau memperbarui komponen yang ada saat aplikasi sedang berjalan. AddIn dapat dimutakhirkan saat Aplikasi sedang berjalan dan pembaruan tampak mulus bagi pengguna. Anda harus memiliki AppDomain untuk itu.

  2. Lisensi berdasarkan komponen yang dibeli. Kami dapat mengontrol AddIn mana yang dimuat oleh peran dan izin pengguna dan apakah AddIn dilisensikan untuk digunakan.

  3. Perkembangan cepat (waktu-ke-pasar lebih cepat). Pengembangan AddIn sangat cocok dengan Agile metodologi, tim pengembangan mengembangkan satu AddIn pada satu waktu tanpa harus juga mengembangkan bagian integrasi dengan sisa aplikasi.

  4. Peningkatan QA (hanya QA satu komponen pada satu waktu). QA kemudian dapat menguji dan mengeluarkan cacat untuk sedikit fungsionalitas. Kasus uji lebih mudah untuk dikembangkan dan diimplementasikan.

  5. Deployment (tambahkan komponen saat dikembangkan dan dirilis dan mereka "hanya berfungsi"). Penempatan hanya masalah membuat AddIn dan menginstal file. Tidak ada pertimbangan lain yang diperlukan!

  6. Komponen baru bekerja dengan komponen lama. AddIn yang dikembangkan sejak awal terus bekerja. AddIns baru masuk ke dalam Aplikasi dengan mulus

pengguna151112
sumber
3
Saya telah melakukan semua hal di atas dengan MEF di .NET 4 dan saya pikir ini lebih sederhana daripada MAF ...
Tim
21
@ Jim: dapatkah Anda menghapus add-in MEF yang ada saat menjalankan Sejauh yang saya tahu, rakitan add-in tidak dapat dibongkar begitu dimuat, karena berada di AppDomain yang sama.
Scott Whitlock
6
@Scott - +1 (dapatkah saya memberikan lebih dari satu?) Manfaat lain yang tidak tercantum di sini: Anda dapat mem-sandbox hak keamanan addin menggunakan MAF, sedangkan hak keamanan yang digunakan oleh komponen di MEF akan berbagi hak yang sama dengan menjalankan aplikasi.
Doug
2
@ScottWhitlock: Anda menyiratkan bahwa tidak mungkin untuk menggunakan MEF dengan beberapa AppDomain yang tidak benar.
M. Strtr
25

Dalam pandangan saya kedua teknologi tersebut sebenarnya menargetkan penggunaan yang sangat berbeda.

MEF biasanya terbaik dalam skenario injeksi ketergantungan murni di mana orang atau kelompok yang memberikan solusi terintegrasi akhir merakit semuanya dan menjamin integritas keseluruhan tetapi memiliki kebutuhan untuk memiliki implementasi yang berbeda dari kemampuan utama.

MAF adalah untuk skenario di mana seseorang / kelompok sedang mengembangkan platform atau tuan rumah dan kelompok lain akan menambah kemampuan setelah fakta dan dengan cara tidak di bawah kendali kelompok tuan rumah. Dalam skenario ini yang dibutuhkan adalah mekanisme yang lebih rumit untuk "melindungi" host dari tambahan jahat (atau untuk melindungi tambahan satu sama lain).

Teknologi serupa ketiga dalam pola adalah seluruh skema ProviderBase. Ini juga memungkinkan penggantian kemampuan tetapi tujuannya adalah benar-benar skenario di mana host / aplikasi benar-benar membutuhkan kemampuan dan kebutuhan sebenarnya untuk menentukan implementasi yang berbeda melalui konfigurasi.

Raoul
sumber
18

Saya baru saja menemukan artikel yang panjang ini membahas MAF dan MEF. http://emcpadden.wordpress.com/2008/12/07/managed-extensibility-framework-and-others/

Selain poin yang dibuat oleh jawaban lain, kedengarannya seolah-olah salah satu perbedaan utama antara MEF dan MAF adalah bahwa Kerangka Kerja Diperpanjang yang Dikelola akan memungkinkan satu bagian kompos bergantung bergantung pada yang lain. Misalnya, plug-in bergantung pada plug-in lain, misalnya.

Framework Extensibility yang Dikelola juga tidak benar-benar membuat perbedaan antara host dan add-in, seperti yang dilakukan System.AddIn. Sejauh menyangkut MEF, mereka semua hanyalah bagian yang dapat dikomposisikan.

dthrasher
sumber
9

Menurut pendapat saya, cara terbaik untuk menemukan perbedaan adalah beberapa kode langsung. Saya menemukan dua langkah-langkah MSDN, keduanya dengan contoh kalkulator sehingga Anda dapat dengan mudah membandingkan implementasinya:

MEF: Simple kalkulator misalnya menggunakan bagian MEF
( M anaged E xtensibility F ramework)

  • Memperlihatkan cara membangun kalkulator sederhana menggunakan teknologi MEF. Tidak menunjukkan cara memuat dll eksternal. (Tetapi Anda dapat memodifikasi contoh dengan menggunakan catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll")); alih-alih menggunakan catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));dan mengekstrak kode kalkulator dan kontrak untuk memisahkan proyek DLL.)
  • MEF tidak perlu memiliki struktur direktori tertentu, itu sederhana dan mudah digunakan, bahkan untuk proyek-proyek kecil. Ia bekerja dengan atribut, untuk menyatakan apa yang diekspor, yang mudah dibaca dan dipahami. Contoh: [Export(typeof(IOperation))] [ExportMetadata("Symbol", '+')] class Add: IOperation { public int Operate(int left, int right) { return left + right; } }

  • MEF tidak secara otomatis berurusan dengan versi

MAF: Simple kalkulator dengan V1 dan V2 versi plugin MAF
( M anaged A ddin F ramework)

  • Memperlihatkan cara membangun kalkulator dengan menggunakan plugin V1 dan kemudian cara beralih ke plugin V2 sambil mempertahankan kompatibilitas ke belakang ( catatan: Anda dapat menemukan versi plugin V2 di sini , tautan dalam artikel asli terputus)
  • MAF memberlakukan struktur direktori tertentu , dan memerlukan banyak kode boilerplate untuk membuatnya berfungsi, maka saya tidak merekomendasikannya untuk proyek kecil. Contoh:
    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters

Baik MEF dan MAF termasuk dalam .NET Framework 4.x. Jika Anda membandingkan dua contoh, Anda akan melihat bahwa plugin MAF memiliki kompleksitas yang jauh lebih banyak dibandingkan dengan kerangka kerja MEF - jadi Anda perlu berpikir dengan hati-hati kapan harus menggunakan mana dari kerangka itu.

Mat
sumber
3

MAF dan MEF keduanya dapat menggunakan AppDomains dan keduanya dapat memuat / membongkar dll dalam runtime. Namun perbedaan yang saya temukan adalah: MAF AddIns dipisahkan, komponen MEF longgar digabungkan; MAF "Activate" (instance baru) sementara MEF membuat instance secara default.

Dengan MEF Anda dapat menggunakan Generics untuk membuat GenericHost untuk kontrak apa pun. Ini berarti MEF memuat / membongkar dan manajemen komponen dapat di perpustakaan umum dan digunakan secara umum.

JeffBramlett
sumber