1

複数のインスタンスを作成する必要がある一部のインポートがあります。周りを検索して、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`

どこかで(今のところリンクが見つかりません) 、属性でTypeinを指定することが問題であることがわかりました。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サイトでこれに関する議論を見つけました。

4

1 に答える 1

1

一般に、.NET 4.0では、ExportFactoryはそのままではサポートされていません。ExportFactoryは、コンテナ(またはカスタムエクスポートプロバイダー)が認識して特別に処理する特殊なタイプであり、受信したエラーメッセージに基づいて、このコンテナはIMyModuleにキャストしようとしているため、ExportFactoryについて特別なことを認識していないように見えます。 。

グレンのExportFactoryのテストを見て、Microsoft.ComponentModel.Composition.Hosting.ExportFactoryProviderをコンテナに追加しましたか?

また、.NET 4.5に切り替えるオプションがある場合は、ExportFactoryがそのままサポートされていることにも注意してください。

于 2012-09-11T02:45:33.947 に答える