مشاركة عبر


نظرة عامة حول إطار عمل الامتداد التي تتم إدارتها

يوفر هذا الموضوع نظرة عامة مدارة الامتداد المقدمة في 4 إطار عمل.NET Framework.

يشتمل هذا الموضوع على الأقسام التالية.

  • ما هو MEF؟
  • الخطأ من التوافق مع البرامج الخارجية
  • يوفر MEF
  • الموقع هو MEF متوفر؟
  • MEF و MAF
  • SimpleCalculator: تطبيق مثال
  • حاوية إنشاء وكتالوجات
  • قم باستيراد و تصدير باستخدام الالسمات
  • المزيد من عمليات الاستيراد و ImportMany
  • المنطق آلة حاسبة
  • توسيع SimpleCalculator استخدام فئة جديد
  • توسيع SimpleCalculator تجميع جديد باستخدام
  • الخاتمة
  • الموقع انتقال الآن؟

ما هو MEF؟

إطار عمل للامتداد التي تمت إدارتها أو MEF هو مكتبة لإنشاء تطبيقات خفيفة وقابلة للتوسعة. تسمح لمطوري التطبيقات إلى اكتشاف واستخدام ملحقات يتطلب أي تكوين. كما يسمح للمطورين ملحق بسهولة تغليف تعليمات برمجية وتجنب fragile تبعيات القرص الثابت. MEF لا يسمح الملحقات إلى يمكن إعادة استخدامها في التطبيقات، ولكن عبر تطبيقات أيضا.

الخطأ من التوافق مع البرامج الخارجية

تخيل أنك مهندس من قطر أيمن متوسط تطبيق الذي يجب أن توفر دعما للقابلية للتوسعة. قام تطبيق الخاص بك لتضمين عدد كبير من المحتمل أن يكون أصغر من المكونات، و هو مسؤولاً عن إنشاء وتشغيلها.

الطريقة الأسهل لحل المشكلة هو تضمين المكونات كتعليمات برمجية المصدر في تطبيق الخاص بك، واستدعاء إليها مباشرة من تعليمات برمجية. ويكون لهذا عدة عيوب واضحة. والأهم من ذلك، لا يمكنك إضافة مكونات جديدة دون تعديل تعليمات برمجية المصدر، تقييد قد يكون مقبولاً في تطبيق ويب مثلاً، لكنها unworkable في تطبيق العميل. مشكوك فيه بشكل متساو، قد لا يكون لديك حق الوصول إلى تعليمات برمجية المصدر للمكونات، لأنه قد يتم تطوير بالجهات الخارجية، و لنفس reason لا يسمح لهم بالوصول إلى موقعك.

سيكون أسلوباً قليلاً أكثر تعقيداً إلى توفير يؤشر الامتداد أو الواجهة، للسماح decoupling بين تطبيق ومكوناته. تحت هذا الطراز، قد يوفر واجهة تطبيق مكون و API لتمكينه من التفاعل مع التطبيق الخاص بك. هذا حل المشكلة من الحاجة إلى الوصول للتعليمات البرمجية المصدر، ولكن بقي بعض الصعوبات الخاصة به.

لأن تطبيق تفتقر أي سعة اكتشاف المكونات تشغيل الخاصة به، فإنه يجب أن لا يزال يتم بوضوح إخبارك المكونات التي تتوفر و يجب أن يتم تم تحميله. Th هو هو accomplهوhed عادة بشكل صريح regهوtering المكونات متوفر في ملف تكوين. Th هو تعني أن صحة assuring المكونات التي تصبح صيانة هو sue، خاصة إذا أنه هو مستخدم النهائي والمطور غير الذين هو المتوقع للقيام بتحديث.

بالإضافة إلى ذلك، تكون المكونات incapable الاتصال ببعضها البعض، باستثناء من خلال قنوات rigidly معرفة من تطبيق نفسه. إذا قام مهندس تطبيق من المتوقع الحاجة إلى اتصال معين، غير أنه هو المستحيل عادة.

وأخيراً، مكوّن يجب تشغيل مطوري قبول تبعية ثابت تشغيل تجميع الذي يحتوي تشغيل الواجهة التي يتم تطبيق. وهذا يجعل من الصعب مكوّن لاستخدامه في تطبيق واحد أو أكثر من، وأيضا إنشاء مشاكل عند إنشاء إطار عمل اختبار ل مكوّن s.

يوفر MEF

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

يعتبر هذا الأسلوب بحل المشاكل التي تمت مناقشتها في مقطع السابق. Beca استخدم MEF الأجزاء بشكل إلزامي بتعيين القدرات الخاصة بهم، تكون قابلة للاكتشاف في وقت التشغيل، مما يعني أن تجعل تطبيق استخدم الأجزاء دون ملفات تكوين fragile أو القرص الثابت ترميز مراجع. يسمح MEF تطبيقات إلى وقم بفحص الأجزاء ببيانات التعريف الخاصة بهم، دون instantiating لهم أو حتى تحميل تجميعات. كنتيجة، هناك هو لست بحاجة إلى عناية تحديد متى وكيف يجب أن يتم تم تحميله ملحقات.

بالإضافة إلى تصدير المتوفر الخاص به، يمكن تحديد جزء الاستيراد الخاص به، والذي يتم تعبئة بواسطة الأجزاء الأخرى. يجعل هذا الاتصال بين أجزاء ليس فقط ممكنة، ولكن أسهل، و يسمح factoring بضاعة من تعليمات برمجية. على سبيل المثال، الالخدمات العامة إلى مكونات عديدة يمكن أن يكون facإلىred في إلى منفصل جزئيا وسهولة تعديلها أو استبدالها.

لأنه يتطلب الطراز MEF لا تبعية الثابت في تجميع تطبيقات معينة، فإنه يسمح الملحقات لإعادة استخدام من تطبيق إلى تطبيق. وهذا أيضا يسهل إلى تطوير نظام اختبار، مستقلة عن تطبيق، إلى اختبار المكونات الملحقة.

استيراد التي يمكن تعبئتها بالمكونات الملحقة، يقوم بتعريف أحد تطبيقات القابلة للتوسعة مكتوبة باستخدام MEF و قد أيضا بالإعلان عن تصدير لكشف الخدمات تطبيق إلى ملحقات. كل مكون ملحق التصريح يصدّر، و أيضا الإعلان عن الاستيراد. في بهذه الطريقة، تكون المكونات ملحق نفسها قابلة للتوسعة بشكل تلقائي.

الموقع هو MEF متوفر؟

MEF هو جزءا لا يتجزأ من .NET Framework 4، و هو متوفرة أينما.NET Framework هو المستخدمة. يمكنك استخدم MEF في تطبيقات العميل الخاصة بك، سواء كانت استخدم Windows نماذج WPF أو أية التقنية غير ذلك، أو في تطبيقات تلك استخدم ASP.NET.

MEF و MAF

الإصدارات السابقة من برنامج.NET Framework المقدمة في الإدارة إضافة-في "إطار عمل" (MAF)، تم تصميمها للسماح للتطبيقات بعزل وإدارة ملحقات. التركيز MAF هو ذات المستوى أتشغيل قليلاً ثم MEF، تكثيف تشغيل ملحق هو olation وتجميع تحميل وإلغاء تحميل، مع التركيز الخاص MEF هو تشغيل dهوcoverability والقابلية للتوسعة وإمكانية النقل. تتفاعل الإطارات الثاني بشكل متجانس، و تطبيق مفرد يمكن الاستفادة من كليهما.

SimpleCalculator: تطبيق مثال

أن أبسط طريقة إلى معرفة ما يمكن عمله MEF هو إلى بدء إنشاء التطبيقات التي يتم معها. في هذا المثال، يمكنك إنشاء أحد تطبيقات calculaإلىr بسيطة جداً لوحدة التحكم واستخدام MEF إلى تجعل من السهل إلى توسيع. للبدء بها، إنشاء حل تطبيق وحدة تحكم جديد يسمى SimpleCalculator في Visual Studio 2010، و إضافة مرجع إلى تجميع النظام.ComponentModel.Composition، الموقع تتواجد MEF.

افتح Module1.vb أو برنامج.cs وإضافة Importsأو usingعبارات النظام.ComponentModel.إنشاء و النظام.ComponentModel.إنشاء.Hosting. تتضمن مساحات الاسم بين هذه الأنواع MEF ستحتاج إلى تطوير تطبيق القابلة للتوسعة.

وهدف SimpleCalculator هو لإنشاء وحدة تطبيق يقبل حسابية أساسية بأوامر في نموذج "5 + 3" أو "6-2"، وإرجاع الإجابات الصحيحة. يجب أن تكون قادراً أيضا إلى قائمة operaإلىrs متوفر. استخدام MEF، سيكون بإمكانك إلى إضافة operaإلىrs جديدة بدون تغيير تعليمات برمجية للتطبيق.

ملاحظةملاحظة

غرض SimpleCalculator لتوضيح المفاهيم و بناء جملة MEF، بدلاً من ثم لتوفير سيناريو واقعية بالضرورة للاستخدام الخاص به.العديد من التطبيقات التي قد يستفيد معظم من إس MEF المزيد معقدة ثم SimpleCalculator.لمزيداً من الأمثلة، راجع إطار عمل للامتداد التي تتم إدارتها تشغيل Codeplex.

حاوية إنشاء وكتالوجات

الأساسية لنموذج إنشاء MEF هو حاوية إنشاء ، الذي يحتوي على الجميع الأجزاء متوفر و يقوم بإنشاء. (أن هو، مطابقة عمليات الاستيراد إلى تصدير.) النوع الأكثر شيوعاً لإنشاء حاوية هو CompositionContainer، وسيتم استخدام هذا ل SimpleCalculator. (في Visual أساسى، يجب إلى إضافة عمومي Programفئة.) ثم إضافة السطر التالي إلى Programفئة في Module1.vb أو برنامج.cs:

Dim _container As CompositionContainer
private CompositionContainer _container;

لاكتشاف أجزاء متوفر بها، حاويات إنشاء يجعل استخدام من على كاتالوج . نشرة مصورة ما هو كائن يجعل متوفر الأجزاء التي تم اكتشافها من أي مصدر. يوفر MEF النشرات المصورة إلى اكتشاف أجزاء من نوع المتوفر أو تجميع أو direcإلىry؛ يمكن لمطوري التطبيقات بسهولة إنشاء النشرات المصورة الجديدة إلى اكتشاف أجزاء من المصادر غير ذلك، مثل الخدمة ويب.

إضافة الدالة الإنشائية التالية إلى Programالفئة:

Public Sub New()
            'An aggregate catalog that combines multiple catalogs
            Dim catalog = New AggregateCatalog()

            'Adds all the parts found in the same assembly as the Program class
            catalog.Catalogs.Add(New AssemblyCatalog(GetType(Program).Assembly))

            'Create the CompositionContainer with the parts in the catalog
            _container = New CompositionContainer(catalog)

            'Fill the imports of this object
            Try
                _container.ComposeParts(Me)
            Catch ex As Exception
                Console.WriteLine(ex.ToString)
            End Try
        End Sub
        private Program()
        {
            //An aggregate catalog that combines multiple catalogs
            var catalog = new AggregateCatalog();
            //Adds all the parts found in the same assembly as the Program class
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
            
            //Create the CompositionContainer with the parts in the catalog
            _container = new CompositionContainer(catalog);

            //Fill the imports of this object
            try
            {
                this._container.ComposeParts(this);
            }
            catch (CompositionException compositionException)
            {
                Console.WriteLine(compositionException.ToString());
            }
        }

الاستدعاء ComposePartsإعلام إنشاء حاوية لإنشاء التعيين محددة من الأجزاء، في هذه الحالة الحالية مثيل Program. في هذه المرحلة، على الرغم من ذلك، لا شيء سيحدث، منذ Programعلى لا الاستيراد إلى التعبئة.

قم باستيراد و تصدير باستخدام الالسمات

أولاً، يجب عليك Programاستيراد آلة حاسبة. وهذا ما يسمح الفصل واجهة مستخدم قلق، مثل وحدة تحكم إدخال والإخراج التي تتحول إلى Program، من المنطق في آلة حاسبة. قم بإضافة التعليمات البرمجية التالية إلى الفئة Program .

        <Import(GetType(ICalculator))>
        Public Property calculator As ICalculator
        [Import(typeof(ICalculator))]
        public ICalculator calculator;

لاحظ أنه التصريح calculatorالكائن هو غير معتادة، إلا أنه هو تزيين مع Import السمة. Th هو تعريف السمة شيء أن تكون هناك عملية استيراد؛ التي هو، سيتم تعبئته عن طريق إنشاء مشغل عند الكائن هو تتألف.

استيراد كل يحتوي على اتفاق ، التي تحدد ما تصدير إلى أن تتطابق مع. يمكن أن تكون اتفاق سلسلة معينة بشكل صريح، أو أنه يمكن تلقائياً إنشاؤها بواسطة MEF من نوع محدد، في هذا حالة واجهة ICalculator. أي يصدّر التصريح مطابق اتفاق سيتم الوفاء بهذا استيراد. لاحظ أنه أثناء النوع calculatorالكائن هو في الحقيقة ICalculator, th هو هو غير مطلوب; اتفاق هو مستقلة من نوع كائن استيراد. (في هذا حالة، قد تركت خارج typeof(ICalculator). تفترض MEF إلى auإلىmatically اتفاق إلى أن يعتمد تشغيل نوع استيراد إلا إذا حددت بوضوح.)

التالي، إضافة هذه الواجهة بسيطة جداً لوحدة نمطية أو SimpleCalculatorمساحة الاسم:

Public Interface ICalculator
        Function Calculate(ByVal input As String) As String
    End Interface
   public interface ICalculator
    {
         String Calculate(String input);
    }

والآن بعد أن قمت بتعريف ICalculator، تحتاج فئة الذي يقوم بتنفيذ it. إضافة الفئة التالية إلى وحدة نمطية? "أو" SimpleCalculatorمساحة الاسم:

    <Export(GetType(ICalculator))>
    Public Class MySimpleCalculator
        Implements ICalculator

End Class
    [Export(typeof(ICalculator))]
    class MySimpleCalculator : ICalculator
    {
    }

هنا هو التصدير التي تطابق استيراد في Program. في ترتيب إلى يتناسب معه، فيجب أن يكون اتفاق نفسه. تصدير ضمن عقد استناداً إلى typeof(MySimpleCalculator)هو الحصول تشغيل تطابق، و قد لا يتم تعبئة استيراد؛ والعقد يجب أن تتطابق تماما.

وبما أن سوف يتم تعبئة الحاوية إنشاء مع الجميع الأجزاء متوفر في هذا تجميع، MySimpleCalculatorستتوفر جزء. عند المنشئ ل Programيقوم بتركيب تشغيل Programكائن، يتم تعبئة استيراد الخاص به مع MySimpleCalculatorالكائن، الذي سيتم إنشاؤه لهذا الغرض.

واجهة مستخدم الطبقة ( Program) لا تحتاج إلى معرفة أى شىء آخر. ولذلك يمكن تعبئتها في بقية منطق واجهة مستخدم في Mainأسلوب:

    Sub Main()
        Dim p As New Program()
        Dim s As String
        Console.WriteLine("Enter Command:")
        While (True)
            s = Console.ReadLine()
            Console.WriteLine(p.calculator.Calculate(s))
        End While
    End Sub
        static void Main(string[] args)
        {
            Program p = new Program(); //Composition is performed in the constructor
            String s;
            Console.WriteLine("Enter Command:");
            while (true)
            {
                s = Console.ReadLine();
                Console.WriteLine(p.calculator.Calculate(s));
            }
            
        }

هذه التعليمة البرمجية ببساطة بقراءة سطر إدخال و في Calculateوظيفة ICalculatorتشغيل النتيجة التي تكتب بالعودة إلى وحدة التحكم. أن هو الجميع تعليمات برمجية التي تحتاجها في Program. سيحدث المتبقية للعمل في الأجزاء.

المزيد من عمليات الاستيراد و ImportMany

في أجل SimpleCalculator لتكون قابلة للتوسعة، يحتاج إلى استيراد قائمة العمليات. عادية Importسمة هو معبأ بواحد وواحد فقط Export. إذا كان المزيد هو المحرك التركيب متوفرة، ينتج خطأ. إلى إنشاء استيراد التي يمكن تعبئتها بأي عدد من تصدير، يمكنك استخدام ImportManyالسمة، كما يلي:

<ImportMany()>
        Public Property operations As IEnumerable(Of Lazy(Of IOperation, IOperationData))
        [ImportMany]
        IEnumerable<Lazy<IOperation, IOperationData>> operations;

Lazy<T,T>نوع الموفر من قبل MEF للاحتفاظ بالمراجع غير المباشرة لتصدير. هنا، بالإضافة إلى المصدرة كائن نفسه، يمكنك أيضا يحصل يصدّر بيانات التعريف ، أو المعلومات التي تصف تم يصدّره كائن. كل Lazy<T,T>يحتوي على IOperationالكائن، الذي يمثل عملية فعلية، و IOperationDataالكائن، والتي تمثل بيانات التعريف الخاصة بها. إضافة واجهات بسيطة التالية إلى وحدة نمطية? "أو" SimpleCalculatorمساحة الاسم:

    Public Interface IOperation
        Function Operate(ByVal left As Integer, ByVal right As Integer) As Integer
    End Interface

    Public Interface IOperationData
        ReadOnly Property Symbol As Char
    End Interface
    public interface IOperation
    {
         int Operate(int left, int right);
    }

    public interface IOperationData
    {
        Char Symbol { get; }
    }

في هذا cكـe، ملفات التعريف الخاصة بكل عملية هو الرمز الذي يمثل تلك تشغيل، مثل كـ +،-، *، وهكذا. لتوفير عملية الجمع، قم بإضافة الفئة التالية إلى وحدة نمطية? "أو" SimpleCalculatorمساحة الاسم:

    <Export(GetType(IOperation))>
    <ExportMetadata("Symbol", "+"c)>
    Public Class Add
        Implements IOperation

        Public Function Operate(ByVal left As Integer, ByVal right As Integer) As Integer Implements IOperation.Operate
            Return left + right
        End Function
    End Class
    [Export(typeof(IOperation))]
    [ExportMetadata("Symbol", '+')]
    class Add: IOperation
    {
        public int Operate(int left, int right)
        {
            return left + right;
        }      
    }

Exportالسمة الوظائف كما ظهر قبل. ExportMetadataإرفاق سمة بيانات تعريف في النموذج ينشئ ازدواجًا اسم-القيمة، إلى ذلك التصدير. بينما في Addتطبيق فئة IOperation، لا يوجد تطبيق فئة IOperationDataهو من أي وقت مضى بوضوح؛ وبدلاً من ذلك، سيتم ضمنياً إنشاؤه بواسطة MEF مع الخصائص استناداً إلى أسماء ملفات التعريف المتوفرة. (Th هو هو واحدة من عدة طرق الوصول إلى بيانات التعريف في MEF.)

إنشاء في MEF هو العودية . تتألف لوضوح Programالكائن، التي تقوم باستيراد ICalculatorالتي قيد إلى تكون من نوع MySimpleCalculator. MySimpleCalculator، بدوره يقوم باستيراد مجموعة منIOperationسيتم تعبئة الكائنات، وهذا استيراد عندMySimpleCalculatorهو تاريخ الإنشاء، وفي نفس الوقت استيراد منProgram. إذا Addتعريف فئة استيراد أخرى، أن ذلك إلى o إلى يتم تعبئة، وهكذا. استيراد أي يسار unfilled ينتج خطأ إنشاء. (هو المحتملة، على الرغم من ذلك، التصريح باستيراد على الوضع الاختياري أو تعيينها بشكل افتراضي قيم.)

المنطق آلة حاسبة

مع هذه الأجزاء في نفس المكان، كل ذلك يبقى هو منطق حاسبة نفسها. تنفيذ ما يلي أسلوب في MySimpleCalculator:

Public Function Calculate(ByVal input As String) As String Implements ICalculator.Calculate
            Dim left, right As Integer
            Dim operation As Char
            Dim fn = FindFirstNonDigit(input) 'Finds the operator
            If fn < 0 Then
                Return "Could not parse command."
            End If
            operation = input(fn)
            Try
                left = Integer.Parse(input.Substring(0, fn))
                right = Integer.Parse(input.Substring(fn + 1))
            Catch ex As Exception
                Return "Could not parse command."
            End Try
            For Each i As Lazy(Of IOperation, IOperationData) In operations
                If i.Metadata.symbol = operation Then
                    Return i.Value.Operate(left, right).ToString()
                End If
            Next
            Return "Operation not found!"
        End Function
        public String Calculate(String input)
        {
            int left;
            int right;
            Char operation;
            int fn = FindFirstNonDigit(input); //finds the operator
            if (fn < 0) return "Could not parse command.";

            try
            {
                //separate out the operands
                left = int.Parse(input.Substring(0, fn));
                right = int.Parse(input.Substring(fn + 1));
            }
            catch 
            {
                return "Could not parse command.";
            }

            operation = input[fn];
           
            foreach (Lazy<IOperation, IOperationData> i in operations)
            {
                if (i.Metadata.Symbol.Equals(operation)) return i.Value.Operate(left, right).ToString();
            }
            return "Operation Not Found!";
        }  

الخطوات الأولى بتحليل سلسلة إدخال إلى اليسار و الأيمن operوs و حرف عامل تشغيل. في foreachيتكرر كل عضو operationsهو اختبار مجموعة. هذه كائن s من نوع Lazy<T, T>، وقيم بيانات التعريف الخاصة بها وتصديرها كائن يمكن الوصول إليها Metadataخاصية و Valueخاصية على التوالي. في ترتيب هو الحالة، إذا Symbolخاصية IOperationDataالكائن هو dهوcovered أن تطابق، استدعاءات آلة حاسبة التي Operateأسلوب IOperationالكائن وإرجاع النتيجة.

إلى في calculaإلىr، تحتاج أيضا إلى أسلوب مساعد التالية، التي تقوم بإرجاع موضع الحرف غير الرقم أول في سلسلة. إضافة إلى MySimpleCalculatorفئة:

        Private Function FindFirstNonDigit(ByVal s As String) As Integer
            For i = 0 To s.Length
                If (Not (Char.IsDigit(s(i)))) Then Return i
            Next
            Return -1
        End Function
        private int FindFirstNonDigit(String s)
        {
            
            for (int i = 0; i < s.Length; i++)
            {
                if (!(Char.IsDigit(s[i]))) return i;
            }
            return -1;
        }

يجب الآن أن تتمكن إلى ترجمة وتشغيل مشروع. (في Visual أساسى، سوف أول بحاجة إلى إضافة Publicكلمة أساسية إلى Module1.) في شجرة وحدة التحكم، اكتب عملية الجمع، مثل كـ "5 + 3"، والحاسبة وسيتم إرجاع نتائج. آخر عامل سيؤدي إلى رسالة "عمليه غير موجودة!".

توسيع SimpleCalculator استخدام فئة جديد

والآن بعد أن يعمل آلة حاسبة، إضافة عملية جديدة هو سهلة. إضافة الفئة التالية إلى وحدة نمطية? "أو" SimpleCalculatorمساحة الاسم:

    <Export(GetType(IOperation))>
    <ExportMetadata("Symbol", "-"c)>
    Public Class Subtract
        Implements IOperation

        Public Function Operate(ByVal left As Integer, ByVal right As Integer) As Integer Implements IOperation.Operate
            Return left - right
        End Function
    End Class
    [Export(typeof(IOperation))]
    [ExportMetadata("Symbol", '-')]
    class Subtract : IOperation
    {

        public int Operate(int left, int right)
        {
            return left - right;
        }

    }

ترجمة وتشغيل مشروع، والطرح يدعم الآن الحاسبة كـ أيضا كـ الجمع.

توسيع SimpleCalculator تجميع جديد باستخدام

إضافة فئات للتعليمات البرمجية المصدر هو البسيطة كافية، ولكن MEF يوفر القدرة على البحث الآن خارج مصدر خاصة تطبيقات للأجزاء. لتوضيح ذلك، ستحتاج إلى تعديل SimpleCalculator للبحث في الدليل، كـ أيضا كـ الخاصة به كـ sembly، للأجزاء، بواسطة إضافة DirectoryCatalog.

أول، إضافة الدليل يسمى "ملحقات" للمشروع SimpleCalculator. تأكد من أن إلى إضافة على المستوى مشروع، وليس على المستوى الحل. ثم إضافة مشروع جديد للحل، يسمى ExtendedOperations. مشروع الجديد سوف يحول برمجياً في تجميع منفصلة.

فتح الإطار "خصائص" لمشروع ExtendedOperations، حدد علامة تبويب بنية، و تغيير "مسار إخراج" للإشارة إلى المجلد ملحقات في الدليل مشروع SimpleCalculator.

في برنامج.cs، إضافة السطر التالي إلى Programالمنشئ:

catalog.Catalogs.Add(New DirectoryCatalog("C:\\Calculator\\Extensions"))
catalog.Catalogs.Add(new DirectoryCatalog("C:\\Calculator\\Extensions"));

قم باستبدال مسار المثال بالمسار إلى الدليل الملحقات الخاصة بك. (Th هو هو لأغراض الوضع التصحيح. في تطبيق كامل، يمكنك استخدام مسار نسبي.) DirectoryCatalogالآن إضافة أية أجزاء في أي تجميعات في direcإلىry ملحقات إلى حاوية التكوين.

إلى إضافة القطع للتجميع الثاني، أولاً إضافة مرجع إلى SimpleCalculator في مشروع ExtendedOperations. قم بإضافة الفئة التالية إلى ‏‏رمز الملف ExtendedOperations:

    <Export(GetType(SimpleCalculator.IOperation))>
    <ExportMetadata("Symbol", "%"c)>
    Public Class Mod
        Implements IOperation

        Public Function Operate(ByVal left As Integer, ByVal right As Integer) As Integer Implements IOperation.Operate
            Return left % right
        End Function
    End Class
    [Export(typeof(SimpleCalculator.IOperation))]
    [ExportMetadata("Symbol", '%')]
    public class Mod : SimpleCalculator.IOperation
    {
        public int Operate(int left, int right)
        {
            return left % right;
        }
    }

ملاحظة هذا الترتيب في للعقد إلى مطابقة Exportيجب أن تكون السمة من نفس نوع Import. ترجمة و تشغيل مشروع، و الآن سوف يكون متاحاً للعامل متوسط (%).

الخاتمة

هذا الموضوع بتغطية المفاهيم أساسى من MEF.

  • أجزاء، النشرات المصورة، و إنشاء حاوية

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

  • استيراد و تصدير

    استيراد و تصدير هي الطريقة التي تبلغ المكونات. بواسطة استيراد، يحدد مكوّن حاجة لالقيمة معينة أو الكائن، و مع تصدير وهي تحدد مدى توفر القيمة. استيراد كل يتطابق مع قائمة تصدير بطريقة من اتفاق الخاصة بها.

الموقع انتقال الآن؟

لمزيد من المعلومات وأمثلة تعليمات برمجية، راجع إطار عمل للامتداد التي تمت إدارتها. للحصول على قائمة بأنواع MEF ، راجع مساحة الاسم System.ComponentModel.Composition.