MEF中具有元数据访问的多个接口
本文关键字:接口 访问 元数据 MEF | 更新日期: 2023-09-27 18:09:31
我已经创建了三个接口:
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的元数据到接口A
[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
支持通过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将自动为您投影。