私は舞台裏でImportAttribute
またはImportManyAttribute
がエクスポートタイプの実際のインスタンスとペアにエクスポートしたメタデータを取得するために、MEFのいくつかのコアメソッドを使用する必要があると考えています。 Bのエクスポートされた値を取得するとき、私はこのように、IMetadata
インタフェースを介してA
とそれに関連するメタデータの正しくエクスポートインスタンスとAData
を閲覧することができます今すぐはMEFにImportAttributeまたはImportManyAttributeを使用せずに、メタデータをエクスポートされますか?
//the metadata interface
public interface IMetadata {
string Name {get;}
}
//the custom ExportAttribute
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
[MetadataAttribute]
public class CustomExportAttribute : ExportAttribute, IMetadata {
public string Name {get;set;}
}
//the class which need to be exported (both value and metadata)
[CustomExport(Name = "someName")]
public class A {
}
//the class which imports the exported value and metadata
[Export]
public class B {
[Import]
public Lazy<A, IMetadata> AData {get;set;}
}
:これらの属性を使用すると、以下の設定で正常に動作します
var ac = new AggregateCatalog();
ac.Catalogs.Add(new DirectoryCatalog("."));
var c = new CompositionContainer(ac);
var b = c.GetExportedValue<B>();
var data = b.AData.Value;//some instance of A here
var mdata = b.AData.Metadata;//some metadata of A here
この場合、クラスB
は使用したくないですが、Aとそのメタデータのインスタンスのエクスポートされたペアをどのように取得できますか? (B
のような)任意のクラスを使用していないので、属性ImportAttribute
も、この場合には使用されません。ここで は、私が試したものです:
ませ輸出は制約一致する見つかりませんでした:ContractName System.Lazy(テストを
var ac = new AggregateCatalog(); ac.Catalogs.Add(new DirectoryCatalog(".")); var c = new CompositionContainer(ac); var a = c.GetExportedValue<Lazy<A,IMetadata>>();
上記の最後の行は次のように、例外
ImportCardinalityMismatchException
をスローします。 、Test.IMetadata)RequiredTypeIdentity System.Lazy(Test.A、Test.IMetadata)
私は、エクスポートされた値(タイプインスタンスとそのメタデータの組を取得するためのいくつかの方法がなければならないと信じている)を直接使用せずそのクラスのいくつかのプロパティにエクスポートされた値を格納するためにImportAttribute
が使用されるダミークラスです。
この問題で私を助けてください、私はまだMEFとプリズムを使い始めますよ。ご協力いただきありがとうございます!
これは少し隠されている、本当に助けてくれてありがとう。私が気にしていた問題は、他の問題に関わって以来、遠く離れています。私はまだこれをテストしていませんが、うまくいくはずです。 – Hopeless