繁体   English   中英

MEF中具有元数据访问的多个接口?

[英]Multiple Interfaces with Metadata access in 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; } }
}

现在,我要在接口A中导出接口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 ...

请给我一些想法,我如何才能在接口A中获得所有接口B的导出。

可以使用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会自动为您投影。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM