私はMEFをよく理解していないので、うまくいけば、これはどのように動作するか簡単な修正です。MEF GetExports <T、TMetaDataView> AllowMultiple = Trueで何も返さない
私はMEFを使用してクラスに関する情報とその使用方法を取得しようとしています。私はこれを達成するためにメタデータオプションを使用しています。私のインタフェースと属性は、次のようになります
public interface IMyInterface
{
}
public interface IMyInterfaceInfo
{
Type SomeProperty1 { get; }
double SomeProperty2 { get; }
string SomeProperty3 { get; }
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ExportMyInterfaceAttribute : ExportAttribute, IMyInterfaceInfo
{
public ExportMyInterfaceAttribute(Type someProperty1, double someProperty2, string someProperty3)
: base(typeof(IMyInterface))
{
SomeProperty1 = someProperty1;
SomeProperty2 = someProperty2;
SomeProperty3 = someProperty3;
}
public Type SomeProperty1 { get; set; }
public double SomeProperty2 { get; set; }
public string SomeProperty3 { get; set; }
}
属性で飾られているクラスは、次のようになります。
[ExportMyInterface(typeof(string), 0.1, "whoo data!")]
[ExportMyInterface(typeof(int), 0.4, "asdfasdf!!")]
public class DecoratedClass : IMyInterface
{
}
インポートを使用しようとしている方法は、次のようになります。
private void SomeFunction()
{
// CompositionContainer is an instance of CompositionContainer
var myExports = CompositionContainer.GetExports<IMyInterface, IMyInterfaceInfo>();
}
私の場合、myExports
は常に空です。私のCompositionContainerには、私のカタログに2つのExportDefinitions
があり、どちらも次のものがあります。ContractName
: "MyNamespace.IMyInterface"。 Metadata
も、エクスポートごとに正しくロードされます。
AllowMultiple
セッターを削除し、1つのエクスポートされた属性のみを含めると、myExports
変数にはロードされたメタデータとともに1回のエクスポートが行われるようになりました。
私は間違っていますか?
編集:私が使用している場合は弱い私の輸出が急に満たされ、メタデータを入力:
var myExports = CompositionContainer.GetExports<IMyInterface, IDictionary<string, object>>();
任意のアイデアはなぜですか?
うんを呼び出すことができるはずです。私はこの昨日投稿するつもりでしたが、私はあなたのポイントを楽しむことができる前に他のものに引っ張られてしまいました。il/blogs/bnaya/archive/2010/01/29/mef-for-beginner-repeatable-metadata- ! – sohum
クラスを 'ExportAttribute'ではなく' Attribute'から継承させる必要はありません。 'MetadataAttributeAttribute'のポイントは簡潔で簡潔です;-)。カスタムメタデータビューを使用し、手動で配列を処理するだけで私の仕事ができます。ドキュメントから 'AllowMultiple'がメタデータエントリを配列にするのは明らかです。 – binki