การเลือกระหว่าง MEF และ MAF (System.AddIn)


162

Managed Extensibility Framework (MEF) และ Managed AddIn Framework (MAF, aka System.AddIn) ดูเหมือนจะทำงานที่คล้ายกันมาก ตามคำถาม Stack Overflow นี้MEF เป็นสิ่งทดแทนสำหรับ System.Addin หรือไม่ คุณสามารถใช้ทั้งสองอย่างพร้อมกันได้

เมื่อไหร่ที่คุณจะเลือกใช้ตัวหนึ่งกับตัวอื่น? คุณจะเลือกใช้ทั้งสองอย่างด้วยกันภายใต้สถานการณ์ใดบ้าง

คำตอบ:


131

ฉันประเมินตัวเลือกเหล่านี้แล้วและนี่คือข้อสรุปที่ฉันได้รับ

MAF เป็นเฟรมเวิร์ก addon ที่แท้จริง คุณสามารถแยกส่วนเสริมของคุณออกได้อย่างสมบูรณ์แม้กระทั่งเรียกใช้ภายในโดเมนแอพแยกต่างหากเพื่อที่ว่าถ้า addon ขัดข้องมันจะไม่ทำให้แอปพลิเคชันของคุณเสีย นอกจากนี้ยังมีวิธีที่สมบูรณ์มากในการแยกตัวแอดออนออกจากสิ่งใด ๆ ยกเว้นสัญญาที่คุณให้ ในความเป็นจริงคุณสามารถกำหนดรุ่นอะแดปเตอร์สัญญาของคุณเพื่อให้ความเข้ากันได้ย้อนหลังกับ addons เก่าในขณะที่คุณกำลังอัปเกรดแอปหลัก ในขณะที่ฟังดูดี แต่มันมาพร้อมกับราคาที่หนักมากที่คุณต้องจ่ายเพื่อข้ามโดเมน คุณจ่ายราคานี้ในความเร็วและในความยืดหยุ่นของประเภทที่คุณสามารถส่งไปมา

MEF เป็นเหมือนการพึ่งพาการฉีดที่มีประโยชน์เพิ่มเติมบางอย่างเช่นการค้นพบและ ... (วาดช่องว่างบนอันนี้) ระดับความโดดเดี่ยวที่ MAF ไม่มีอยู่ใน MEF พวกเขาเป็นสองกรอบที่แตกต่างกันสำหรับสองสิ่งที่แตกต่างกัน


5
สิ่งหนึ่งที่มีขนาดเล็ก: โปรดจำไว้ว่า 'appdomain แยกต่างหาก' ไม่ช่วยคุณถ้า addon ของคุณล่มในเลเยอร์ดั้งเดิมเพื่อที่คุณจะยังต้องใช้กระบวนการของผู้ปฏิบัติงาน MAF ช่วยบ้างกับการสร้างพวกเขา แต่แบบไดนามิกฟื้นตัวจากความผิดพลาดดังกล่าวยังค่อนข้างยาก ( แต่เป็นไปได้)
Quetzalcoatl

@Ian: โปรดอ่านความคิดเห็นของฉันอีกครั้ง :) ฉันเขียนไปแล้วและอีกมาก: MAF อนุญาตอย่างนั้น แต่คุณต้องลุกขึ้นหลังจากความผิดพลาดทั้งหมดด้วยตัวเอง
quetzalcoatl

@DanielG> มันมาพร้อมกับราคาที่หนักมากที่คุณต้องจ่ายเพื่อข้ามแอปโดเมน <ทำไมถึงเป็นเช่นนั้น หนักเท่าไหร่'?
Martin Meeser

2
@MartinMeeser เมื่อข้ามโดเมนแอปคุณต้องทำให้เป็นอนุกรมทุกอย่างหรือใช้วัตถุ MarshalByRef การสื่อสารนั้นยากกว่าการพูดคุยระหว่างวัตถุในโดเมนแอพเดียวกัน
Danielg

65

สิ่งที่ Danielg พูดนั้นดี ฉันจะเพิ่ม:

หากคุณดูวิดีโอเกี่ยวกับ System.Addins พวกเขากำลังพูดถึงโครงการขนาดใหญ่มากอย่างชัดเจน เขาพูดเกี่ยวกับทีมหนึ่งที่จัดการแอปพลิเคชันโฮสต์อีกทีมหนึ่งจัดการ AddIn แต่ละทีมและทีมที่สามที่จัดการสัญญาและขั้นตอนการผลิต ตามที่ฉันคิดว่า System.Addins ชัดเจนสำหรับการใช้งานขนาดใหญ่ ฉันกำลังคิดแอปพลิเคชันเช่นระบบ ERP เช่น SAP (อาจไม่ใช่เรื่องใหญ่ แต่คุณได้แนวคิด) หากคุณดูวิดีโอเหล่านั้นคุณสามารถบอกได้ว่าปริมาณงานที่ใช้งาน System.Addins นั้นใหญ่มาก มันจะทำงานได้ดีถ้าคุณมี บริษัท จำนวนมากที่เขียนโปรแกรม Add-in ของบุคคลที่สามสำหรับระบบของคุณและคุณไม่สามารถทำลายสัญญา Add-in เหล่านั้นใด ๆ ภายใต้โทษประหารชีวิตได้

ในทางกลับกัน MEF ดูเหมือนจะแบ่งปันความคล้ายคลึงกันมากขึ้นกับรูปแบบ Add-in ของชาร์ปเดวิพัฒนา, สถาปัตยกรรมปลั๊กอิน Eclipse หรือ Mono.Addins เข้าใจง่ายกว่า System.Addins และฉันเชื่อว่ามันยืดหยุ่นกว่ามาก สิ่งที่คุณสูญเสียคือคุณไม่ได้รับการแยกจาก AppDomain หรือสัญญาที่รัดกุมกับ MEF จุดแข็งของ MEF คือคุณสามารถจัดโครงสร้างแอปพลิเคชันทั้งหมดของคุณเป็นองค์ประกอบของชิ้นส่วนดังนั้นคุณสามารถจัดส่งผลิตภัณฑ์ของคุณในการกำหนดค่าที่แตกต่างกันสำหรับลูกค้าที่แตกต่างกันและหากลูกค้าซื้อคุณสมบัติใหม่ และแอปพลิเคชันจะเห็นและเรียกใช้ นอกจากนี้ยังอำนวยความสะดวกในการทดสอบ คุณสามารถยกตัวอย่างวัตถุที่คุณต้องการทดสอบและป้อนมันจำลองวัตถุสำหรับการอ้างอิงทั้งหมด

จุดที่สำคัญที่สุดที่ฉันต้องการพูดถึงคือแม้ว่า System.Addins อยู่ในกรอบแล้วฉันไม่เห็นหลักฐานมากมายของคนที่ใช้มัน แต่ MEF กำลังนั่งอยู่บน CodePlex ซึ่งควรจะรวมอยู่ใน .NET 4 และผู้คนเริ่มสร้างแอปพลิเคชั่นจำนวนมากแล้ว (รวมอยู่ในตัวเอง) ฉันคิดว่ามันจะบอกคุณบางอย่างเกี่ยวกับกรอบทั้งสอง


1
"ถ้าคุณดูวิดีโอเกี่ยวกับ System.Addin", วิดีโออะไร คุณกรุณาให้ลิงค์ ขอบคุณ
jimjim

1
@Arjang - มีคู่ที่ช่อง 9 ลองใช้channel9.msdn.com/Blogs/DanielMoth/Managed-AddIn-Framework
Chris Spicer

60

มีการพัฒนาและจัดส่งใบสมัคร MAF มุมมองของฉันเกี่ยวกับ MAF ค่อนข้างน่าเบื่อ

MAF เป็นระบบ "de-coupled" หรือระบบ "loosely-coupled" ที่แย่ที่สุด MEF เป็นระบบ "คู่" หรือ "คู่หลวม" ที่ดีที่สุด

ประโยชน์ของ MAF ที่เรารับรู้โดยใช้ MAF คือ:

  1. การติดตั้งใหม่หรืออัพเดทส่วนประกอบที่มีอยู่ในขณะที่แอปพลิเคชันทำงาน สามารถอัปเดต AddIn ได้ในขณะที่แอปพลิเคชันทำงานอยู่และการอัปเดตจะปรากฏต่อผู้ใช้อย่างราบรื่น คุณต้องมี AppDomains

  2. ใบอนุญาตขึ้นอยู่กับส่วนประกอบที่ซื้อมา เราสามารถควบคุม AddIn ที่โหลดโดยบทบาทของผู้ใช้และการอนุญาตและ AddIn นั้นได้รับอนุญาตให้ใช้งานหรือไม่

  3. การพัฒนาอย่างรวดเร็ว (เร็วกว่าเวลาสู่ตลาด) การพัฒนา AddIn นั้นเหมาะสมกับวิธีการ Agile อย่างสมบูรณ์ทีมพัฒนาได้พัฒนา AddIn ครั้งละหนึ่งโดยไม่ต้องพัฒนาส่วนการรวมกับส่วนที่เหลือของแอปพลิเคชัน

  4. ปรับปรุง QA (QA เพียงองค์ประกอบเดียวในแต่ละครั้ง) QA สามารถทดสอบและออกข้อบกพร่องสำหรับฟังก์ชันการทำงานเพียงเล็กน้อย กรณีทดสอบนั้นง่ายต่อการพัฒนาและนำไปใช้

  5. การปรับใช้ (เพิ่มส่วนประกอบตามที่ได้รับการพัฒนาและเผยแพร่และ "ทำงาน") การปรับใช้เป็นเพียงเรื่องของการสร้าง AddIn และติดตั้งไฟล์ ไม่มีข้อควรพิจารณาอื่น ๆ !

  6. ส่วนประกอบใหม่ทำงานกับส่วนประกอบเก่า AddIn ที่ได้รับการพัฒนา แต่เนิ่นๆยังคงทำงานต่อไป AddIns ใหม่เข้ากับแอปพลิเคชันได้อย่างลงตัว


3
ฉันได้ทำทุกอย่างที่กล่าวกับ MEF ใน .NET 4 และฉันคิดว่ามันง่ายที่ MAF ...
ทิม

21
@Jim: คุณสามารถถอนการติดตั้งโปรแกรมเสริม MEF ที่มีอยู่ในขณะที่ทำงานอยู่ได้หรือไม่? เท่าที่ฉันรู้แล้วแอสเซมบลี Add-in ไม่สามารถทำการโหลดได้เมื่อทำการโหลดเนื่องจากมันอยู่ใน AppDomain เดียวกัน
Scott Whitlock

6
@Scott - +1 (ฉันสามารถให้มากกว่าหนึ่งได้หรือไม่) ประโยชน์อื่นที่ไม่ได้ระบุไว้ที่นี่: คุณสามารถแซนด์บ็อกซ์สิทธิ์ความปลอดภัยของ Addin โดยใช้ MAF ในขณะที่สิทธิ์ความปลอดภัยที่ใช้โดยองค์ประกอบใน MEF จะใช้สิทธิ์เดียวกัน ใบสมัคร
Doug

2
@ScottWhitlock: คุณหมายความว่าเป็นไปไม่ได้ที่จะใช้ MEF กับ AppDomain หลายอันซึ่งไม่เป็นความจริง
M.Stramm

25

ในมุมมองของฉันทั้งสองเทคโนโลยีมีเป้าหมายการใช้งานที่แตกต่างกันมาก

โดยทั่วไปแล้ว MEF นั้นดีที่สุดในสถานการณ์การฉีดที่ต้องพึ่งพาอาศัยกันซึ่งบุคคลหรือกลุ่มที่นำเสนอโซลูชั่นแบบครบวงจรขั้นสุดท้ายจะรวมทุกอย่างและรับรองความถูกต้องโดยรวม แต่มีความต้องการในการใช้งานความสามารถหลักที่แตกต่างกัน

MAF สำหรับสถานการณ์ที่บางคน / กลุ่มกำลังพัฒนาแพลตฟอร์มหรือโฮสต์และกลุ่มอื่น ๆ จะเพิ่มความสามารถหลังจากข้อเท็จจริงและในทางที่ไม่อยู่ภายใต้การควบคุมของกลุ่มโฮสต์ ในสถานการณ์สมมตินี้จำเป็นสำหรับกลไกที่ซับซ้อนมากขึ้นเพื่อ "ปกป้อง" โฮสต์จากโปรแกรมโกงเพิ่มเติม (หรือเพื่อป้องกันโปรแกรมเพิ่มเติมจากกัน)

เทคโนโลยีที่คล้ายกันในรูปแบบที่สามคือแบบแผน ProviderBase ทั้งหมด สิ่งนี้ยังช่วยให้สามารถแทนที่ความสามารถได้ แต่เป้าหมายของมันคือสถานการณ์จริงที่โฮสต์ / แอปต้องการความสามารถอย่างแท้จริง


18

ฉันเพิ่งพบบทความยาว ๆ ที่พูดถึงทั้ง MAF และ MEF http://emcpadden.wordpress.com/2008/12/07/managed-extensibility-framework-and-others/

นอกเหนือจากประเด็นที่ทำโดยคำตอบอื่น ๆ มันฟังดูราวกับว่าหนึ่งในความแตกต่างที่สำคัญระหว่าง MEF และ MAF คือกรอบการจัดการความสามารถในการจัดการจะช่วยให้ส่วนหนึ่งที่ประกอบได้ขึ้นอยู่กับอีกส่วนหนึ่ง มันจะให้ปลั๊กอินขึ้นอยู่กับปลั๊กอินอื่นตัวอย่างเช่น

Managed Extensibility Framework นั้นไม่ได้สร้างความแตกต่างระหว่างโฮสต์และ Add-in อย่างแท้จริงเช่นเดียวกับ System.AddIn เท่าที่ MEF เกี่ยวข้องพวกเขาล้วนเป็นแค่องค์ประกอบ


9

ในความคิดของฉันวิธีที่ดีที่สุดที่จะค้นพบความแตกต่างคือบางรหัสบนมือ ฉันพบคำแนะนำแบบ MSDN สองวิธีโดยมีตัวอย่างเครื่องคิดเลขเพื่อให้คุณสามารถเปรียบเทียบการใช้งานของพวกเขาได้อย่างง่ายดาย:

MEF: ตัวอย่างเครื่องคิดเลขอย่างง่ายโดยใช้ชิ้นส่วน MEF
( M anaged E xtensibility F ramework)

  • แสดงวิธีสร้างเครื่องคิดเลขอย่างง่ายโดยใช้เทคโนโลยี MEF ไม่แสดงวิธีการโหลด DLLs ภายนอก (แต่คุณสามารถปรับเปลี่ยนตัวอย่างได้โดยใช้ catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll")); แทนการใช้catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));และแยกรหัสเครื่องคิดเลขและสัญญากับโครงการ DLL ที่แยกต่างหาก)
  • MEF ไม่จำเป็นต้องมีโครงสร้างไดเรกทอรีเฉพาะมันง่ายและตรงไปตรงมาใช้แม้สำหรับโครงการขนาดเล็ก มันทำงานร่วมกับคุณสมบัติในการประกาศสิ่งที่ส่งออกซึ่งง่ายต่อการอ่านและเข้าใจ ตัวอย่าง: [Export(typeof(IOperation))] [ExportMetadata("Symbol", '+')] class Add: IOperation { public int Operate(int left, int right) { return left + right; } }

  • MEF ไม่ได้จัดการกับการกำหนดเวอร์ชันโดยอัตโนมัติ

MAF: เครื่องคิดเลขอย่างง่ายพร้อมปลั๊กอิน รุ่นMAF V1 และ V2
( M anaged A ddin F ramework)

  • แสดงวิธีสร้างเครื่องคิดเลขโดยใช้ปลั๊กอิน V1 และวิธีย้ายไปยังปลั๊กอิน V2 ในขณะที่รักษาความเข้ากันได้แบบย้อนหลัง ( หมายเหตุ:คุณสามารถค้นหาปลั๊กอินเวอร์ชัน V2 ได้ที่นี่ลิงค์ในบทความต้นฉบับเสีย)
  • MAF บังคับใช้โครงสร้างไดเรกทอรีเฉพาะและต้องการรหัสสำเร็จรูปมากมายเพื่อให้ทำงานได้ดังนั้นฉันจึงไม่แนะนำให้ใช้สำหรับโครงการขนาดเล็ก ตัวอย่าง:
    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters

MEF และ MAF ทั้งสองจะรวมอยู่ใน. NET Framework 4.x หากคุณเปรียบเทียบสองตัวอย่างคุณจะสังเกตเห็นว่าปลั๊กอิน MAF มีความซับซ้อนมากขึ้นเมื่อเทียบกับกรอบ MEF - ดังนั้นคุณต้องคิดให้รอบคอบว่าจะใช้เฟรมเวิร์กเหล่าใดเมื่อใด


3

ทั้ง MAF และ MEF สามารถใช้ AppDomains และทั้งสองสามารถโหลด / unload dll ในขณะทำงาน อย่างไรก็ตามความแตกต่างที่ฉันได้พบคือ: MAF AddIns แยกส่วน MEF ประกอบหลวม MAF "เปิดใช้งาน" (อินสแตนซ์ใหม่) ขณะที่ MEF สร้างอินสแตนซ์ตามค่าเริ่มต้น

ด้วย MEF คุณสามารถใช้ Generics เพื่อสร้าง GenericHost สำหรับสัญญาใด ๆ นี่หมายถึง MEF load / unload และการจัดการส่วนประกอบสามารถอยู่ในไลบรารีทั่วไปและใช้โดยทั่วไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.