กลยุทธ์การอัปเดตปลั๊กอิน MEF สำหรับ winforms

ฉันกำลังพัฒนาแอปพลิเคชันแบบขยายได้ด้วย MEF แอปพลิเคชันจะมีปลั๊กอินหลายประเภทสำหรับรวบรวมและประมวลผลข้อมูลในรูปแบบต่างๆ

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

คงจะดีไม่น้อยหาก MEF สามารถโหลดปลั๊กอินเดียวกันเวอร์ชันต่างๆ พร้อมกันได้ แม้ว่าจากสิ่งที่ฉันเข้าใจแล้ว สิ่งนี้จะเป็นไปไม่ได้ (แก้ไขฉันหากฉันผิด)

ดังนั้นฉันจึงลาออกจากความจริงที่ว่าฉันจะต้องอัปเดตปลั๊กอินและเก็บถาวรเวอร์ชันก่อนหน้า

อะไรจะเป็นกลยุทธ์ที่ดีที่สุดในการทำเช่นนี้?

ตัวอย่างที่ 1

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

--- ดูเหมือนว่าวิธีแก้ปัญหาจะยุ่งเล็กน้อย

ตัวอย่างที่ 2

แอปพลิเคชันจะดาวน์โหลดเวอร์ชันใหม่ของปลั๊กอินที่ทำงานอยู่ซึ่งโหลดไว้ ปลั๊กอินถูกห่อหุ้มไว้ในตัวติดตั้งบางประเภท โปรแกรมติดตั้งจะปิดโฮสต์อย่างสวยงามและเก็บถาวรปลั๊กอินที่มีอยู่ โปรแกรมติดตั้งจะติดตั้งปลั๊กอินใหม่และรีสตาร์ทแอปโฮสต์

--- มันก็ดูยุ่งๆ นิดหน่อยเหมือนกัน

ฉันกำลังค้นหาการแก้ไขสมมติฐานของฉัน หรือข้อมูลเชิงลึกเกี่ยวกับกลยุทธ์ที่ประสบความสำเร็จเพื่อให้บรรลุเป้าหมาย


person TheGeneral    schedule 02.03.2013    source แหล่งที่มา


คำตอบ (1)


.NET Framework มีความกลัวที่เรียกว่า Shadow Copy ซึ่งช่วยให้คุณ อัพเดต asebmlies ที่โหลดแล้ว โดยพื้นฐานแล้วมันจะคัดลอกแอสเซมบลีไปยังโฟลเดอร์ชั่วคราวและโหลดจากที่นั่น วิธีนี้จะทำให้แอสเซมบลีที่อยู่ในโฟลเดอร์การติดตั้งแอปพลิเคชันของคุณจะไม่ถูกล็อคโดยระบบปฏิบัติการ และคุณจะสามารถแทนที่แอสเซมบลีเหล่านั้นได้ ASP.NET, framweorks การทดสอบหน่วย และแอปพลิเคชันอื่นๆ อีกมากมายใช้การคัดลอกเงา

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

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

  1. แอสเซมบลีที่มีชื่อแข็งแกร่งใน GAC
  2. แอสเซมบลีที่มีเวอร์ชันรวมอยู่ในชื่อ (เช่น Plugin.v1.dll) การตั้งชื่อที่ชัดเจนเป็นทางเลือกในกรณีนี้ แต่ก็เป็นความคิดที่ดี ข้อดีของแนวทางนี้คือปลั๊กอินตั้งแต่สองเวอร์ชันขึ้นไปสามารถอยู่ร่วมกันในไดเร็กทอรีเดียวกันได้

ดูคำตอบนี้เพื่อดูตัวอย่าง MEF + การกำหนดเวอร์ชัน

คุณยังสามารถใช้คุณสมบัติการจัดองค์ประกอบของ MEF และอัปเดตคอนเทนเนอร์ปลั๊กอินของคุณหลังจาก:

  • มีการเพิ่มชุดปลั๊กอินใหม่
  • ชุดประกอบปลั๊กอินถูกลบ
  • มีการเปลี่ยนชุดปลั๊กอิน

ดูตัวอย่างคำถามนี้

person Panos Rontogiannis    schedule 02.03.2013
comment
ขอบคุณสำหรับคำตอบและลิงก์อย่างละเอียด ชัดเจนมาก คะแนนเต็ม :) - person TheGeneral; 03.03.2013