MEF 編程指南(四):聲明導入

組合部件經過 [System.ComponentModel.Composition.ImportAttribute] 特性聲明導入。相似於導出,也有幾種不一樣的方法聲明導入,即經過:字段(Fields)、屬性(Properties)和構造器參數(Constructor Parameters)。
 
 
屬性導入(Property Imports)
 
 
爲了向屬性導入值,使用 [System.ComponentModel.Composion.ImportAttribute] 特性標識。以下例中導入 IMessageSender。
 
        [Import]
        public IMessageSender MessageSender { get; set; }
 
構造器參數(Constructor Parameters)

也能夠經過構造器參數指定導入。這意味着爲每一個導入添加構造器參數,而沒必要爲每一個屬性添加導入。使用構造器參數導入,遵循如下幾點。

 
1. 構造器添加 [System.ComponentModel.Compostition.ImportingConstructorAttribute] 特性 。
2. 爲每一個導入添加構造器參數。


例如:在 Program 類的構造器中導入 MessageSender
 
        [ImportingConstructor]
        public Program(IMessageSender messageSender)
        {
           
        }

 

參數導入(Parameter Imports)

有幾種不一樣的方式在構造器上定義導入。

1. 隱式導入 - 默認狀況下,容器會使用參數類型確認契約。例如:下面的代碼,將使用 IMessageSender 契約。
2. 顯示導入 - 若是想指定導入契約,在相應參數上添加 [System.ComponentModel.Composition.ImportAttribute] 特性。
 
 
字段導入(Field Imports)
 
MEF 也支持直接爲字段導入值。
 
        [Import]
        private IMessageSender _messageSender;

 

 
注意: 在徹底信任(Full Trust)的時候支持 導入或者導出私有成員(字段、屬性和方法),可是部分信任(Medium/Partial)可能會出問題。
 
 
缺省導入(Optional Imports)
 
 
MEF 容許指定缺省導入。當啓用它,若是類型可用容器會提供導出,不然將導入設置爲 Default<T>。爲了獲得一個缺省導入,在導入上設置 AllowDefault=true。以下例:
 
OrderController 缺省導入一個 Logger。若是 Logger 不存在,會設置 private _logger 字段爲 DefaultLogger 實例,不然使用導入的 Logger。
 
 
導入集合(Importing Collections)
 
除了單一導入之外,也可以使用 ImportMany 特性導入集合。這意味着全部特定的契約實例都會被容器導入。

MEF 部件也能夠支持重排(Recomposition)。這意味着容器中新的導出變得可用,集合會自動更新爲新的設置。例如:下面的 Notifier 類導出 IMessageSender 集合。這意味着若是容器中有3個可用的 IMessageSender 導出,在組合時候會被推送到 Senders 屬性。
 
 
    public class Notifier
    {
        [ImportMany(AllowRecomposition=true)]
        public IEnumerable<IMessageSender> Senders { get; set; }
 
        public void Notify(string message)
        {
            foreach (IMessageSender sender in Senders)
            {
                sender.Send(message);
            }
        }
    }

 

IPartImportsSatisfiedNotification 接口
 
某些狀況下,在 MEF 對於類的實例的導入過程完成時候得到通知是很是重要的。若是要得到通知,實現 [System.ComponentModel.Composition.IPartImportsSatisfiedNotification] 接口。這個接口僅有一個方法:在類實例結合完成時候,OnImportsSatisfied 被調用。
 

        public void OnImportsSatisfied()
        {
            // when this is called, all imports that could be satisfied have been satified.
        }

 

 
原文地址:
相關文章
相關標籤/搜索