複数のインスタンスを作成する必要がある一部のインポートがあります。周りを検索して、ExportFactoryクラスを使用する必要があると判断しました。残念ながら、ExportFactoryクラスはデフォルトではWPFで使用できませんが、幸いなことに、GlennBlockがコードを移植しました。
もともと、インポート時にタイプを指定していました。
[ImportMany(typeof(IMyModule))]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
また、エクスポート属性を作成しました。
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
public class ExportMyModuleMetadata : ExportAttribute, IMyModuleMetadata
{
public ExportMyModuleMetadata(string category, string name)
: base(typeof(IMyModuleData))
{
Category = category;
Name = name;
}
public string Category { get; set; }
public string Name { get; set; }
}
私のエクスポートは次のようになります。
[ExportMyModuleMetadata("Standard","Post Processor")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class Module1 : IMyModuleData
上記のインポートは正常に機能しました。しかし、私がに変更Lazy<T,T>
するExportFactory<T,T>
と、作曲中にエラーが発生し始めました。
[ImportMany(typeof(IMyModule))]
public IEnumerable<ExportFactory<IMyModule, IMyModuleMetadata>> Modules { get; set; }
私が受け取ったエラーメッセージは次のとおりです。
The export 'Module1 (ContractName="IMyModule")' is not assignable to type
'System.ComponentModel.Composition.ExportFactory`
どこかで(今のところリンクが見つかりません) 、属性でType
inを指定することが問題であることがわかりました。ImportMany
私はそれなしでできると思ったので、タイプをから削除しましたImportMany
。
[ImportMany()]
public IEnumerable<Lazy<IMyModule, IMyModuleMetadata>> Modules { get; set; }
このインポートは、を使用しても引き続き機能しましたLazy<T,T>
が、に変更するとExportFactory<T,T>
、何もインポートしなくなりました。エラーは発生しなくなりましたが、何もインポートされません。
誰かがWPFで適切に使用ImportMany
する方法を知っていますか?ExportFactory<T,T>
アップデート:
を追加することについてのWesのヒントでExportFactoryProvider()
、私はExportFactory<T,T>
.NET 4で動作するようになりました!以下は、更新された構成コードです。
var ep = new ExportFactoryProvider();
//Looks for modules in main assembly and scans folder of DLLs for modules.
var moduleCatalog = new AggregateCatalog(
new AssemblyCatalog(runningApp),
new DirectoryCatalog(".", "*.dll"));
var container = new CompositionContainer(moduleCatalog, ep);
ep.SourceProvider = container;
var Modules = new Modules();
container.ComposeParts(Modules);
また、これについてもう少し話しているMEFCodeplexサイトでこれに関する議論を見つけました。