2011-09-23 54 views
1

我已經創建了三個接口:MEF中具有元數據訪問的多個接口?

interface A 
{ 
    B obj{ get; } 
} 

interface B 
{ 
    C obj { get; } 
} 

interface C { } 

[Export(typeof(C))] 
class class C1 : C 
{ 
    //......... 
} 


[Export[typeof(B)] 
[ExportMetadata("Name", "ABC") 
class class1 : B 
{ 
    [Import(typeof(C))] 
    public C Cvalues; 

    public C obj 
    { 
    get { return Cvalues; } 
    } 
} 

[Export(typeof(B))] 
[ExportMetadata("Name", "XYZ")] 
class class2 : B 
{ 
    [Import(typeof(C))] 
    public C Cvalues; 

    public C obj { get { return Cvalues; } } 
} 

現在,我想在接口接口B的元數據導出一個

[Export(typeof(A)) 
class AA : A 
{ 

    // how i get the B here 
    [Import(typeof(B)] 
    public B Bvalues; 

    public B objB { get { return Bvalues; } } 
} 

,如果我嘗試再創建接口A接口B的酒店在一個導入B它給我輸出,但ImportMany怎麼樣,因爲接口B返回ImportMany ...

請給我一些想法如何讓我所有的接口B出口在接口A.

回答

1

可以使用Lazy<T, TMetdat>實例導入元數據。簡單來說,這意味着:

[Import(typeof(B))] 
Lazy<B, IDictionary<string, object>> _b; 

public B ObjectB { get { return _b.Value; } } 

public string NameB { get { return _b.Metadata["Name"]; } } 

但是,往往是一個好主意,定義元數據的合同,如:

public interface INameMetdata 
{ 
    string Name { get; } 
} 

,你可以用它代替字典:

[Import(typeof(B))] 
Lazy<B, INameMetadata> _b; 

public B ObjectB { get { return _b.Value; } } 

public string NameB { get { return _b.Metadata.Name; } } 

使用元數據合約將使您能夠使用靜態類型的接口實現,MEF將自動爲您投影。

+0

不明白你的想法請詳細描述一下 –

+0

我試圖實現你的邏輯,但不工作。關於邏輯,我可以在Lazy中調用單個組件,但是當擴展目錄Lazy中的多個組件不能使用組件時。它不會給出任何錯誤,但內部過程不會發生。如果你給一些適當的演示,那麼請給這裏。經過測試的演示更適合guding。謝謝 –

+0

@ user166694如果你想導入多個組件,請在類型爲IEnumerable >' –