MEF學習筆記(2)——建立MEF

來源:互聯網
上載者:User

建立MEF包含CompositionContainer的執行個體,給它增加Composable part(包含程式自己本身),然後組合。

 

以下是建立的順序

 

  1. 建立宿主類。在樣本中,我們使用命令列程式,所以宿主在Program類。
  2. 增加System.ComponentModel.Composition引用。
  3. 增加如下命名空間:using System.Component.Composition
  4. 增加Compose()方法,建立container執行個體,然後組裝。
  5. 增加Run()方法,它調用Compose()。
  6. 在Main()函數中,啟動宿主。

 

注意,對於ASP.NET和WPF程式來講,建立宿主類沒有必要。

 

請看代碼:

 

 using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;

 

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

public void Run()
{
Compose();
}

private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this);
}
}

 

7. 定義一個或多個exports。這段代碼展示了我們定義了一個IMessageSender介面。我們也定義了EmailSender composable part,它exports一個IMessageSender,並用[System.ComponentModel.Composition.Export]標籤聲明了。

 

  public interface IMessageSender
{
void Send(string message);
}

[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}

 

8. 給宿主類增加屬性,並用Import標籤標記。

 

[Import]
public IMessageSender MessageSender { get; set; }

 

9. 增加part到container。在MEF中,有很多種方式來做。一種是直接增加composable part的執行個體。另一種,更常見的是使用catalog。

 

直接增加composable part執行個體

  在Compose()方法手動增加一個composable part,使用ComposePart()擴充方法。如下:

 

private void Compose()
{
var container = new CompositionContainer();
container.ComposeParts(this, new EmailSender());
}

 

使用AssemblyCatalog來增加Container

  使用catablog,container自動處理建立的parts,而不是顯示增加他們。為了這樣做,在Compose()方法中建立一個catalog。然後傳入container的建構函式。

  在這個例子中,AssemblyCatalog顯示將正在執行的程式集傳入建構函式。我們沒有增加EmailSender的執行個體。

 

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

 

 

如下是全部代碼:

 

using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System;

public class Program
{
[Import]
public IMessageSender MessageSender { get; set; }

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

public void Run()
{
Compose();
MessageSender.Send("Message Sent");
}

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

public interface IMessageSender
{
void Send(string message);
}

[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine(message);
}
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.