MEF ve MAF (System.AddIn) arasında seçim yapma


162

Yönetilen Genişletilebilirlik Çerçevesi (MEF) ve Yönetilen AddIn Çerçevesi (MAF, diğer adıyla System.AddIn) çok benzer görevleri yerine getiriyor gibi görünüyor. Bu Yığın Taşması sorusuna göre, MEF System.Addin'in yerini alıyor mu? , her ikisini de aynı anda kullanabilirsiniz.

Birini diğerine ne zaman kullanmayı seçersiniz? Hangi koşullar altında her ikisini birlikte kullanmayı tercih edersiniz?

Yanıtlar:


131

Bu seçenekleri değerlendiriyorum ve işte geldiğim sonuç.

MAF gerçek bir eklenti çerçevesidir. Eklentileriniz çöktüğünde uygulamanızı devre dışı bırakmayacak şekilde eklentilerinizi ayrı bir uygulama etki alanında çalıştırarak bile tamamen ayırabilirsiniz. Ayrıca, eklentileri onlara verdiğiniz sözleşmeden başka bir şeye bağlı olarak ayırmak için çok eksiksiz bir yol sağlar. Aslında, ana Uygulamayı yükseltirken eski eklentilere geriye dönük uyumluluk sağlamak için sözleşme adaptörlerinizi sürümlendirebilirsiniz. Bu harika görünse de, uygulama alanlarını geçmek için ödemeniz gereken ağır bir fiyatla birlikte gelir. Bu fiyatı hızlı bir şekilde ve ileri geri gönderebileceğiniz türlerin esnekliğinde ödersiniz.

MEF, keşfedilebilirlik ve ... gibi bazı ek faydaları olan bağımlılık enjeksiyonu gibidir (bu konuda boş çizim). MAF'ın sahip olduğu izolasyon derecesi MEF'de mevcut değildir. İki farklı şey için iki farklı çerçeve.


5
küçük bir şey: addon'unuz yerel bir katmanda çökerse, 'ayrı uygulama etki alanının' size yardımcı OLMADIĞINI unutmayın, bunun için hala çalışan işlemlere ihtiyacınız olacaktır. MAF onları oluşturmaya biraz yardımcı olur, ancak böyle bir çarpışmadan dinamik olarak kurtarma hala oldukça zordur (ancak mümkün)
quetzalcoatl

@Ian: lütfen yorumumu tekrar okuyun :) Tam olarak yazdım ve DAHA FAZLA: MAF gerçekten buna izin veriyor, ancak kazadan sonra tek başına kalkmanız gerekiyor.
quetzalcoatl

@DanielG> Uygulama alanlarını geçmek için ödemeniz gereken ağır bir bedel ile geliyor <Bu neden? Ne kadar ağır'?
Martin Meeser

2
@MartinMeeser Uygulama alanlarını geçerken her şeyi serileştirmeli veya bir MarshalByRef nesnesi kullanmalısınız. İletişim, aynı uygulama alanındaki nesneler arasında konuşmaktan çok daha zordur.
Danielg

65

Danielg'in söyledikleri iyi. Ekleyeceğim:

System.Addins hakkındaki videoları izlerseniz, çok büyük projelerden bahsediyorlar. O bir bahsediyor takım evsahibi uygulamasını bir antrenörlük takımı her AddIn yönetme ve üçüncü ekip sözleşme ve boru hattını yöneten. Buna dayanarak, System.Addins'in daha büyük uygulamalar için açıkça olduğunu düşünüyorum. SAP gibi ERP sistemleri gibi uygulamaları düşünüyorum (belki o kadar büyük değil, ama fikri anlıyorsunuz). Bu videoları izlediyseniz, System.Addins kullanmak için gereken iş miktarının çok büyük olduğunu söyleyebilirsiniz. Sisteminiz için 3. taraf eklentileri programlayan çok sayıda şirketiniz varsa ve ölüm cezası altında bu eklenti sözleşmelerinden herhangi birini kıramazsanız iyi olurdu.

Öte yandan MEF, SharpDevelop'un eklenti şeması, Eclipse eklenti mimarisi veya Mono.Addins ile daha fazla benzerlik paylaşıyor gibi görünüyor. System.Addins ve anlamak çok daha esnek olduğuna inanıyorum. Kaybettiğiniz şeyler, MEF ile AppDomain izolasyonu veya güçlü versiyonlama sözleşmeleri edinmemenizdir. MEF'in güçlü yönleri, tüm uygulamanızı bir parça bileşimi olarak yapılandırabilmenizdir, böylece ürününüzü farklı müşteriler için farklı yapılandırmalarda gönderebilirsiniz ve müşteri yeni bir özellik satın alırsa, bu özelliğin parçasını yükleme dizinine bırakmanız yeterlidir ve uygulama onu görür ve çalıştırır. Ayrıca testi kolaylaştırır. Test etmek istediğiniz nesneyi başlatabilir ve tüm bağımlılıkları için sahte nesneleri besleyebilirsiniz,

Bahsetmek istediğim en önemli nokta, System.Addins zaten çerçevede olmasına rağmen, onu kullanan insanların çok fazla kanıtı görmüyorum, ancak MEF sadece orada dahil edileceği düşünülen CodePlex'te oturuyor .NET 4 ve insanlar zaten onunla çok sayıda uygulama geliştirmeye başlıyor (kendim dahil). Sanırım bu iki çerçeve hakkında bir şeyler anlatıyor.


1
"System.Addin ile ilgili videoları izlerseniz", Hangi videolar? Lütfen bağlantıyı verir misiniz? Teşekkür ederim
jimjim


60

Bir MAF uygulaması geliştirip sevk ettik. MAF hakkındaki görüşlerim biraz yorgun.

MAF, en kötü ihtimalle "bağlanmamış" bir sistem veya "gevşek bağlanmış" bir sistemdir. MEF en iyi ihtimalle "birleştirilmiş" sistem veya "gevşek çift" sistemdir.

MAF kullanarak gerçekleştirdiğimiz MAF avantajları:

  1. Uygulama çalışırken yeni bileşenler yükleme veya mevcut bileşenleri güncelleme. AddIn, Uygulama çalışırken güncellenebilir ve güncellemeler kullanıcıya sorunsuz bir şekilde görünür. Bunun için AppDomains'e sahip olmalısınız.

  2. Satın alınan bileşenlere dayalı lisanslama. Kullanıcının rolü ve izinleri tarafından hangi AddIn'in yüklendiğini ve AddIn'in kullanım için lisanslanıp lisanslanmadığını kontrol edebiliriz.

  3. Hızlı gelişme (daha hızlı pazara sunma süresi). AddIn geliştirme, Agile methodolgy ile mükemmel uyum sağlar, geliştirme ekibi, uygulamanın geri kalanıyla da entegrasyon parçasını geliştirmek zorunda kalmadan bir seferde bir AddIn geliştirdi.

  4. Geliştirilmiş KG (bir seferde yalnızca KG bileşenleri). KG daha sonra tek bir işlevsellik için hataları test edebilir ve yayınlayabilir. Test senaryolarının geliştirilmesi ve uygulanması daha kolaydı.

  5. Dağıtım (bileşenleri geliştirildikçe ve piyasaya sürüldükçe ekleyin ve “sadece çalışırlar”). Dağıtım yalnızca bir AddIn oluşturmak ve dosyayı yüklemekle ilgilidir. Başka düşünmeye gerek yoktu!

  6. Yeni bileşenler eski bileşenlerle çalıştı. AddIn bu çalışma üzerinde erken geliştirilmeye devam etti. Yeni Eklentiler Uygulamaya sorunsuz bir şekilde sığar


3
Yukarıdakilerin hepsini .NET 4'te MEF ile yaptım ve daha basit olduğunu düşünüyorum MAF ...
Tim

21
@Jim: Çalışırken mevcut bir MEF eklentisini kaldırabilir misiniz? Bildiğim kadarıyla, aynı AppDomain içinde olması nedeniyle eklenti derlemesi yüklendikten sonra kaldırılamıyor.
Scott Whitlock

6
@Scott - +1 (birden fazla verebilir miyim?) Burada listelenmeyen başka bir avantaj: MAF kullanarak eklentinin güvenlik haklarını korumalı olarak yerleştirebilirsiniz, MEF'de bir bileşenin kullandığı güvenlik hakları çalışanlarla aynı hakları paylaşacaktır uygulama.
Doug

2
@ScottWhitlock: MEF'i doğru olmayan birden fazla AppDomain ile kullanmanın imkansız olduğunu ima ediyorsunuz.
M.Stramm

25

Bence iki teknoloji aslında çok farklı kullanım örneklerini hedef alıyor.

MEF tipik olarak en iyisi, nihai entegre çözümü sunan kişi veya grubun her şeyi bir araya getirdiği ve genel bütünlük için kefil olduğu, ancak farklı temel yetenek uygulamalarına ihtiyaç duyduğu saf bağımlılık enjeksiyon senaryosunda en iyisidir.

MAF, bir kişinin / grubun bir platform veya ana bilgisayar geliştirdiği ve diğer grupların, ana bilgisayar grubunun kontrolü altında olmayan bir şekilde yetenekler ekleyeceği bir senaryo içindir. Bu senaryoda, ana bilgisayarı haydut eklentilerinden "korumak" (veya eklentileri birbirinden korumak) için daha ayrıntılı mekanizmalara ihtiyaç vardır.

Bir desene benzer üçüncü bir teknoloji, tüm ProviderBase şemasıdır. Bu aynı zamanda bir yeteneğin değiştirilmesini de sağlar ancak hedefi, ana bilgisayarın / uygulamanın kesinlikle bir yeteneğe ihtiyaç duyduğu senaryodur ve gerçekten de yapılandırma yoluyla farklı uygulamaları belirtmektir.


18

Az önce MAF ve MEF'yi tartışan bu uzun makaleyi buldum. http://emcpadden.wordpress.com/2008/12/07/managed-extensibility-framework-and-others/

Diğer cevaplar tarafından yapılan noktalara ek olarak, MEF ve MAF arasındaki temel farklılıklardan biri, Yönetilebilir Genişletilebilirlik Çerçevesinin bir birleştirilebilir parçanın diğerine bağımlı olmasına izin vereceğidir. Örneğin, bir eklentinin başka bir eklentiye bağlı olmasına izin verir.

Yönetilen Genişletilebilirlik Çerçevesi de System.AddIn'in yaptığı gibi ana bilgisayar ve eklenti arasında gerçekten ayrım yapmaz. MEF söz konusu olduğunda, hepsi sadece birleştirilebilir parçalardır.


9

Bence, farklılıkları keşfetmenin en iyi yolu bazı uygulamalı kodlardır. Uygulamalarını kolayca karşılaştırabilmeniz için her ikisi de bir hesap makinesi örneğiyle iki MSDN kılavuzu buldum:

MEF: MEF parçalarını kullanan basit hesap makinesi örneği
( M anaged E xtensibility F ramework )

  • MEF teknolojisini kullanarak basit bir hesap makinesinin nasıl oluşturulacağını gösterir. Harici dll'lerin nasıl yükleneceğini göstermez. (Ancak örneği kullanmak catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll")); yerine kullanarak değiştirebilirsiniz. catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly)); DLL projelerini ve hesap makinesi kodu ve sözleşme ayıklamak .)
  • MEF gelmez hatta küçük projeler için, basit ve kullanımı basittir, belirli bir dizin yapısı olması gerekir. O , nitelikler ile çalışır okumak ve anlamak kolay olan ihraç ne ilan etmek. Misal: [Export(typeof(IOperation))] [ExportMetadata("Symbol", '+')] class Add: IOperation { public int Operate(int left, int right) { return left + right; } }

  • MEF, sürüm oluşturma ile otomatik olarak ilgilenmez

MAF: V1 ve V2 sürümü ile basit hesap MAF eklentileri
( M anaged A ddin F ramework)

  • Bir V1 eklentisi kullanarak hesap makinesinin nasıl oluşturulacağını ve daha sonra geriye dönük uyumluluğu korurken bir V2 eklentisine nasıl geçileceğini gösterir ( not: eklentinin V2 sürümünü bulabilirsiniz) burada bulabilirsiniz) , orijinal makaledeki bağlantı kopmuştur)
  • MAF belirli bir dizin yapısını zorlar ve çalışmasını sağlamak için çok sayıda kaynak koduna ihtiyaç duyar, bu nedenle küçük projeler için tavsiye etmiyorum. Misal:
    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters

Hem MEF hem de MAF, .NET Framework 4.x'te bulunmaktadır. İki örneği karşılaştırırsanız, MAF eklentilerinin MEF çerçevesine kıyasla çok daha karmaşık olduğunu fark edeceksiniz - bu yüzden bu çerçevelerden hangisini kullanacağınızı dikkatlice düşünmeniz gerekir.


3

MAF ve MEF her ikisi de AppDomains kullanabilir ve her ikisi de çalışma zamanında dll yükleyebilir / kaldırabilir. Ancak bulduğum farklar: MAF Eklentileri ayrıştırılmış, MEF bileşenleri gevşek bağlanmıştır; MEF varsayılan olarak örnek oluştururken MAF "Etkinleştirir" (yeni örnek).

MEF ile Generics'i herhangi bir sözleşme için GenericHost yapmak için kullanabilirsiniz. Bu, MEF yükleme / boşaltma ve bileşen yönetiminin ortak bir kütüphanede olabileceği ve genel olarak kullanılabileceği anlamına gelir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.