2011-12-20 40 views
1

我一個項目轉換爲棱鏡/ MEF,需要從中央數據庫棱鏡/ MEF - 當下載的模塊列表加載

下載模塊列表但是「列表下載器」實例參考設置對空,因此假設該代碼是不是在正確的地方

這裏的流動

public class Bootstrapper : MefBootstrapper { 
    [Import] 
    IMyList sync1 { get; set; } 

    ... 
    protected override void ConfigureAggregateCatalog() { 
     **sync1.Sync();    // sync1 is null** 

     AggregateCatalog.Catalogs.Add(....) 
    } 
    ... 
} 


[Export(typeof(IMyList))] 
private class DBSync : IMyList { 
    [Import] IDBConn mydb { get; set; } 
    public void Sync(){ 
     // connects to mydb and gets a list of auth modules for the current user 
    } 
} 

的概率是SYNC1爲空!爲什麼?

我知道我做錯了什麼,但是這是從頭開始我的第一個棱鏡項目,所以請去容易

回答

0

您正在使用SYNC1來配置目錄。有沒有可能你還沒有製作你的零件?

對於Bootstrapper的部件來說,它需要由MEF實例化,例如通過使用GetExportedValue <>,否則IMyList將爲空。

如果是這樣,您將需要更改您的代碼,以便MEF在其目錄中已經有IMyList的一部分,然後添加其他部分。

如果這不是你的問題,問題的另一個可能的來源可能滿足DBSync進口的一個時,即是組成錯誤:

[Import] IDBConn mydb { get; set; } 

在這種情況下,你應該得到一個例外。您可以嘗試在調試中運行該程序,同時將該選項設置爲中斷所有公共語言運行時例外。

編輯:

如果容器爲空,將無法構成進口的引導程序類。 MEf在實例化類時導入它的組件。在創建容器之前,不能依賴可用的導入。

您將有:

變化IMyList SYNC1所以這是它不是一個進口了。

如果您確實需要由MEF組成您的IMyList,則需要創建一個臨時容器(無需使用MefBootStrapper),並使用此臨時容器來組成引導程序類中的部件。之後你可以處理它。看到這個其他答案(Satisfy Imports in custom ExportProvider)。

我真的會推薦第一個選項強硬,改變sync1,所以它不是導入,除非你有一個令人信服的理由這樣做。

+0

問題是Bootstrapper.ConfigureModuleCatalog()中的容器爲null,其中模塊列表需要在使用Sync() – Kumar 2011-12-22 19:56:44

0

至於我可以看你有沒有出口IMyList。爲此,我認爲你需要把出口屬性就行私人課前DBCon

我希望這有助於...

奈傑爾...

+0

對不起,更新了這些問題,它是在代碼中完成的,但在問題中未顯示 – Kumar 2011-12-20 20:13:54