C#可擴充套件程式設計之MEF學習筆記(三):匯出類的方法和屬性

雲霏霏發表於2014-08-21

  前面說完了匯入和匯出的幾種方法,如果大家細心的話會注意到前面我們匯出的都是類,那麼方法和屬效能不能匯出呢???答案是肯定的,下面就來說下MEF是如何匯出方法和屬性的。

  還是前面的程式碼,第二篇中已經提供了下載連結,大家可以下載學習。

  首先來說匯出屬性,因為這個比較簡單,和匯出類差不多,先來看看程式碼,主要看我加註釋的地方,MusicBook.cs中的程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;

namespace MEFDemo
{
   [Export("MusicBook")]
   public class MusicBook : IBookService
   {
      //匯出私有屬性
      [Export(typeof(string))]
      private string _privateBookName = "Private Music BookName";

      //匯出公有屬性
      [Export(typeof(string))]
      public string _publicBookName = "Public Music BookName";


      public string BookName { get; set; }

   }

   [Export("MathBook", typeof(IBookService))]
   public class MathBook : IBookService
   {
      public string BookName { get; set; }

      public string GetBookName()
      {
         return "MathBook";
      }
   }

   [Export("HistoryBook", typeof(IBookService))]
   public class HistoryBook : IBookService
   {
      public string BookName { get; set; }

      public string GetBookName()
      {
         return "HistoryBook";
      }
   }

}

program.cs中的程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

namespace MEFDemo
{
   class Program
   {
      [ImportMany("MathBook")]
      public IEnumerable<object> Services { get; set; }

      //匯入屬性,這裡不區分public還是private
      [ImportMany]
      public List<string> InputString { get; set; }

      static void Main(string[] args)
      {
         Program pro = new Program();
         pro.Compose();
         if (pro.Services != null)
         {
            foreach (var s in pro.Services)
            {
               var ss = (IBookService)s;
               Console.WriteLine(ss.GetBookName());
            }
         }
         foreach (var str in pro.InputString)
         {
            Console.WriteLine(str);
         }

         Console.Read();
      }
      
      private void Compose()
      {
         var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
         CompositionContainer container = new CompositionContainer(catalog);
         container.ComposeParts(this);
      }
   }
}

下面還用foreach遍歷輸出屬性的值,執行即可檢視到結果。最後我會附上原始碼供大家下載,這裡就不再截圖了。

下面說匯出方法吧,同理無論是公有方法還是私有方法都是可以匯出的,MusicBook程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;

namespace MEFDemo
{
   [Export("MusicBook")]
   public class MusicBook : IBookService
   {
      //匯出私有屬性
      [Export(typeof(string))]
      private string _privateBookName = "Private Music BookName";

      //匯出公有屬性
      [Export(typeof(string))]
      public string _publicBookName = "Public Music BookName";


      public string BookName { get; set; }

      //匯出公有方法
      [Export(typeof(Func<string>))]
      public string GetBookName()
      {
         return "MusicBook";
      }

      //匯出私有方法
      [Export(typeof(Func<int, string>))]
      private string GetBookPrice(int price)
      {
         return "$" + price;
      }
   }

   [Export("MathBook", typeof(IBookService))]
   public class MathBook : IBookService
   {
      public string BookName { get; set; }

      public string GetBookName()
      {
         return "MathBook";
      }
   }

   [Export("HistoryBook", typeof(IBookService))]
   public class HistoryBook : IBookService
   {
      public string BookName { get; set; }

      public string GetBookName()
      {
         return "HistoryBook";
      }
   }

}

program中的程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

namespace MEFDemo
{
   class Program
   {
      [ImportMany("MathBook")]
      public IEnumerable<object> Services { get; set; }

      //匯入屬性,這裡不區分public還是private
      [ImportMany]
      public List<string> InputString { get; set; }

      //匯入無引數方法
      [Import]
      public Func<string> methodWithoutPara { get; set; }

      //匯入有引數方法
      [Import]
      public Func<int,string> methodWithPara { get; set; }

      static void Main(string[] args)
      {
         Program pro = new Program();
         pro.Compose();
         if (pro.Services != null)
         {
            foreach (var s in pro.Services)
            {
               var ss = (IBookService)s;
               Console.WriteLine(ss.GetBookName());
            }
         }
         foreach (var str in pro.InputString)
         {
            Console.WriteLine(str);
         }

         //呼叫無引數方法
         if (pro.methodWithoutPara != null)
         {
            Console.WriteLine(pro.methodWithoutPara());
         }
         //呼叫有引數方法
         if (pro.methodWithPara != null)
         {
            Console.WriteLine(pro.methodWithPara(3000));
         }

         Console.Read();
      }
      
      private void Compose()
      {
         var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
         CompositionContainer container = new CompositionContainer(catalog);
         container.ComposeParts(this);
      }
   }
}

匯入匯出方法用到了Func<T>委託,當然沒有返回值的話可以用Action<T>委託,關於委託這裡就不多說了,大家可以自行百度。

點選這裡下載原始碼

 

MEF系列文章:

 C#可擴充套件程式設計之MEF學習筆記(一):MEF簡介及簡單的Demo

C#可擴充套件程式設計之MEF學習筆記(二):MEF的匯出(Export)和匯入(Import)

C#可擴充套件程式設計之MEF學習筆記(三):匯出類的方法和屬性

C#可擴充套件程式設計之MEF學習筆記(四):見證奇蹟的時刻

C#可擴充套件程式設計之MEF學習筆記(五):MEF高階進階

 

相關文章