نموذج موفر مساهمة MEF لا يستورد الأجزاء

StackOverflow https://stackoverflow.com/questions/2034555

  •  19-09-2019
  •  | 
  •  

سؤال

لقد كنت أحاول استخدام نموذج الموفر القابل للتكوين للتعامل مع واردات وصادرات MEF الخاصة بي من MEF Contrib (وصلة).لقد قرأت وثائق Codeplex ومنشور مدونة Code Junkie (وصلة);ومع ذلك، لا يبدو أنني أستطيع الحصول على الحاوية لإنشاء الأجزاء.هل أنا على خطأ؟

Program.cs

namespace MEFTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            p.Run();
        }

        // [ImportMany("command", typeof(IHelp))]
        public IEnumerable<IHelp> Commands { get; set; }

        void Run()
        {
            Compose();

            foreach(IHelp cmd in Commands)
            {
                Console.WriteLine(cmd.HelpText);
            }

            Console.ReadKey();
        }

        void Compose()
        {
            var provider = new ConfigurableDefinitionProvider("mef.configuration");
            var catalog = new DefinitionProviderPartCatalog<ConfigurableDefinitionProvider>(provider);
            var container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
 }
}

TestCommand.cs

namespace MEFTest
{
    //[Export("command", typeof(IHelp))]
    public class TestCommand : IHelp
    {
        private string _helpText = "This is a test.";

        public string CommandName
        {
            get { return "Test"; }
        }

        public string HelpText
        {
            get { return _helpText; }
        }
    }
}

قسم تكوين التطبيق:

<mef.configuration>
 <parts>
  <part type="MEFTest.TestCommand, MEFTest">
   <exports>
    <export contract="IHelp" />
   </exports>
  </part>
  <part type="MEFTest.Program, MEFTest">
   <imports>
    <import member="Commands" contract="IHelp" />
   </imports>
  </part>
 </parts>
</mef.configuration>

لا أحصل على أي أخطاء في البناء ويعمل بشكل جيد إذا قمت بالتبديل إلى النظام النموذجي القائم على السمات والذي يعد جزءًا من قلب MEF (مع الكتالوج المناسب أيضًا).Program.Commands يكون دائمًا NULL في المثال أعلاه.لقد حاولت استخدام خاصية فردية بدلاً من مجموعة والحصول على نفس النتائج.

عندما أقوم بتصحيح الأخطاء، يمكنني الحصول على مجموعة Provider.Parts حتى أعرف أنها تصل إلى معلومات التكوين بشكل صحيح؛ومع ذلك، أحصل على InvalidOperationException عندما أقوم بتصحيح الأخطاء ومحاولة البحث في catalog.Parts.

هل لدى أي شخص أي خبرة حول أين أخطأ هنا؟

هل كانت مفيدة؟

المحلول

كما هو موثق هنا, ، تحتاج أيضا إلى هذا في ملف التكوين الخاص بك:

<configSections>
  <section
    name="mef.configuration"
    type="MefContrib.Models.Provider.Definitions.Configurable.PartCatalogConfigurationSection, MefContrib.Models.Provider" />
</configSections>

إذا كان لديك بالفعل ذلك، فقد يكون من المثير للاهتمام أن تظهر لنا أثر مكدس InvalidOperationException التي تحصل عليها عند الوصول provider.Parts.

نصائح أخرى

واجهتني نفس المشكلة ولم أتمكن من تشغيله، ولكن إليك بعض التفاصيل:يبدو أن ComposeParts() لا يعمل كما هو متوقع (على الأقل في الإصدار الذي استخدمته) لأنه يستخدم أساليب ثابتة، تعتمد على الانعكاس للعثور على جميع الواردات المطلوبة (لذلك يبدو أنه لا يمكن تغيير هذا الجزء من خارج MEF).لسوء الحظ، نريد استخدام تكوين XML وليس سمات MEF.

إنه يعمل إذا قمت بإضافة سمات [استيراد] إلى أعضاء الفئة التي تستخدمها مع ComposeParts().في حالتك سيكون هذا "البرنامج".في هذه الحالة سيتم العثور على كافة عمليات التصدير المحددة في ملف التكوين.

لم أتمكن من العثور على أي وثائق أو أمثلة على صفحة MEF Contrib المتعلقة بهذه المشكلة.لا يوجد أيضًا اختبار وحدة في مشروع المساهمة MEF الذي يستخدم ComposeParts().قد يكون الحل البديل هو استخدام Container.GetExportedValues() لاسترداد القيم، ولكن في هذه الحالة يجب عليك تعيين أعضاء الفئات يدويًا.

امل ان يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top