2016-04-26 48 views
1

我有幾個類似這樣的班......沒有創造有需要的參數類MEF ComposeParts被注入

[Export(typeof (IMessageReader))] 
public class DropboxFolderWatchMessageReader : IMessageReader 

和信息讀取器類這樣的...

public class MessageReader 
{ 
    [ImportMany(typeof(IMessageReader))] 
    private List<IMessageReader> readers; 

    public List<Message> GetMessages() 
    { 
     var result = new List<Message>(); 
     readers.ForEach(r => result.AddRange(r.GetMessages())); 

     return result; 
    } 
} 

我的工作單位做到這一點...

public IEnumerable<Message> FetchMessages() 
{ 
    var reader = new MessageReader(); 
    MefComposer.Container.ComposeParts(reader); 

    var messages = reader.GetMessages(); 
    var result = AddMessages(messages); 

    return result; 
} 

在我的第一次迭代中,這是所有有它和它的所有工作就好了。

然後我不得不讓我的消息的讀者做了一點,這反過來,意味着我需要傳遞參數的構造函數...

public DropboxFolderWatchMessageReader(IConfig config) 
{ 
    //... 
} 

當我試圖運行我的代碼得到了一個消息,說明我的讀者不能被創建,因爲他們不再有默認的構造函數。我需要用[ImportingConstructorAttribute]來裝飾一個構造函數。所以,我補充說...

[System.ComponentModel.Composition.ImportingConstructorAttribute] 
public DropboxFolderWatchMessageReader(IConfig config) 
{ 
    //... 
} 

現在編譯並運行正常,但readers集合總是空的。

在其他構造函數中使用相同類型的類中,有Unity注入的對象。這似乎沒有發生在我的MEF代碼中。

所以,這個問題...

如何獲得系統:

  • 進樣IConfig在我的閱讀器類的構造函數
  • 強制讀者收集回去以我的導出的閱讀器類來填充它。

回答

1

我從來沒有混合ImportingConstructor與字段級別的導入,但我認爲它會工作。 (只要你不需要在構造函數或領域從構造函數中調用的方法。)

我一般建議不要混用,產生像一個構造函數:

[System.ComponentModel.Composition.ImportingConstructorAttribute] 
public DropboxFolderWatchMessageReader(IConfig config, [ImportMany(typeof(IMessageReader))] 
IEnumerable<IMessageReader> readers;) 
{ 
    this.reader = readers.ToList(); 
    // rest of body 
} 

如果您需要混合的方法,但需要使用讀者在對象初始化時可以實現如下界面IPartImportsSatisfiedNotification

class DropboxFolderWatchMessageReader : IPartImportsSatisfiedNotification 
{ 
    [ImportMany(typeof(IMessageReader))] 
    private List<IMessageReader> readers; 

    [System.ComponentModel.Composition.ImportingConstructorAttribute] 
    public DropboxFolderWatchMessageReader(IConfig config) 
    { 
     // empty body. readers still null here 
    } 

    public void OnImportsSatisfied() 
    { 
     // old constructor body. 
     // it's safe to use readers here as all imports have been satisfied 
    } 
} 
相關問題