2011-09-23 49 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 >' –