[英]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.