MEFを使用してモジュラーアプリケーションを構築しようとしています。
しかし、構成中はSetExportedValue(..., ...)
を無視して、必要な値/オブジェクトが見つからないようです。パートコンストラクタでMEFが失敗するのはなぜですか?
System.ComponentMode:これは、次のエラーメッセージをもたらす
interface IPlugin { }
class MyClass { [ImportsMany(typeof(IPlugin))] public IEnumerable<Lazy<IPlugin>> Plugins; public LoadParts() { var ac = new AggregateCatalog(); ac.Catalogs.Add(new AssemblyCatalog(typeof(PluginManager).Assembly)); // imagine adding some DirectoryCatalogs here var cc = new CompositionContainer(ac); cc.ComposeExportedValue("MyValue", someinstance); cc.ComposeParts(this); } }
[Export(typeof(IPlugin))] class MyPart : IPlugin { [ImportingConstructor] public MyPart([Import("MyValue")] sometype arg) { } }
:ここ
は私(匿名化および簡略化された)コードでありますl.Composition Warning:1:ComposablePartDefinition 'MyNamespace.MyPart'が拒否されました。組成は変わらない。変更は、次のエラーのために拒否されました:コンポジションで単一の合成エラーが発生しました。根本原因は以下のとおりです。詳細については、CompositionException.Errorsプロパティを確認してください。で結果の
ContractName MyValue RequiredTypeIdentity somenamespace.sometype
:
1)いいえ輸出が制約に一致する見つかりませんでしたインポート「MyNamespace.MyPart..ctor(パラメータ=」... "ContractName =" を設定することはできません... ") 'の部分に' MyNamespace.MyPart 'があります。
要素:MyNamespace.MyPart..ctor(パラメータ= "... " ContractName =" ... ") - > MyNamespace.MyPart - > DirectoryCatalog(パス=" ./")
一部のコンストラクタの仕組みを誤解していますか?
コンストラクタパラメータを受け入れる方法を教えてください。 claificationため
編集:someinstance
はsometype
の特定のインスタンスです。コンテナに型を追加するのではなく、特定のクラスインスタンスを追加したいと思います。
「MyValue」には特定のクラスインスタンスが含まれていますが、私がそのクラスを '[Export]'するだけの場合、私は望んでいない構成で新しいインスタンスを生成しますよね? –
あなたのやり方によって異なります。 [This](https://stefanhenneken.wordpress.com/2011/08/30/mef-teil-6-constructor-injection/)はドイツ語ですが、コードは英語であり、その仕組みを示しています。さらに、コンストラクタパラメータをシングルトンにすることで、それ以上のインスタンスを持たないようにすることができます – lokusking