問題タブ [mef2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - MEF2: 特定のインターフェイスを実装するすべての型をインポートする
MEF2 を使用して簡単なプラグイン システムを作成しようとしています。
私のシナリオでは、プラグインは 1 ~ 10 個しかないため、パフォーマンスの問題を回避するために別のドメインにアセンブリをロードすることを気にしないことにしました。とにかくこれはいいことですが、エクスポートされたオブジェクトにいくつかの制約を課しているようです ([Serializable]
から派生する必要があります: https://msdn.microsoft.com/en-us/library/ms972968.aspxおよびhttp://wwwMarshalByRefObject
を参照) .codeproject.com/Articles/1091726/The-Nuances-of-Loading-and-Unloading-Assemblies-wiおよびhttps://msdn.microsoft.com/en-us/magazine/jj133818.aspx )、そして私はそれらが必要ですソースを制御できないため、POCOオブジェクトになります。
特定のインターフェイスから派生した型をエクスポートするすべてのアセンブリをロードする必要があるだけなので、ディレクトリをスキャンしてアセンブリを収集し、T から派生したすべての型をエクスポートする規則で構成された MEF2 コンテナーを返すことができる単純なカタログ クラスを作成しました (下)。
とにかく、それを使用しようとすると、コンテナー アセンブリが正しく検出されて読み込まれたとしても、カタログにエクスポートを含めることができません。確かに、MEF2エクスポート規則に何かが欠けています。誰かが私に解決策を教えてもらえますか?
https://onedrive.live.com/redir?resid=F8DEF93587EC2C1!258076&authkey=!AKSKUhMwFhV0n-k&ithint=file%2czipで完全なダミーの再現ソリューションを見つけることができます。
関連するコードと使用例は次のとおりです。
使用例:
c# - MEF2 がすべてのパーツ エクスポートにメタデータ属性を適用しないのはなぜですか?
.NET Framework ベースのアプリケーションのコレクションを .NET Core に移植しようとしています。このプロセスの一環として、MEF1 の使用から MEF2 の使用に切り替える必要があります。私は MEF2 に関連する問題に頭を悩ませていましたが (この投稿は非常に役に立ちました)、最近、問題の 1 つの背後にある理由に出くわしました。
特に、カスタムExportAttribute
を使用してメタデータをエクスポートする多くのクラスがあり、それらすべてを別のクラスにインポートして、このメタデータに基づいてフィルタリングしたいと考えています。これは MEF1 ではすべて正常に機能していましたが、MEF2 では「xのエクスポート メタデータが見つからず、デフォルト値が指定されていません」などの問題に遭遇しました。
より具体的には、エクスポートしたクラスに次のように注釈を付けます。
次に、他の場所で、次のようにインポートしようとします。
そして、インポートが完了したら、メタデータでフィルター処理を試みます。
は次TargetDeviceAttribute
のように定義されます。
何が起こっているかというと、パーツ が 2つのエクスポートRelaySystemClientRequestProcessor
に対応していることがわかりました。ただし、「DeviceId」メタデータは後者にのみ関連付けられており、前者には関連付けられていないため、役に立ちません。IClientRequestProcessor<RelaySystemModel>
RelaySystemClientRequestProcessor
完全にテストしていませんが、これを解決できると思われる方法がいくつかあります。
ExportMetadata("DeviceId", "<<foo>>")
エクスポートされたすべてのパーツに属性を適用します。TargetDeviceAttribute
コンストラクターを使用するように変更しますpublic TargetDeviceAttribute(string deviceId, Type exportType) : base(exportType)
。
私はこれらの解決策に賛成ではありません。前者はメタデータ キーを変更したい場合に問題があり、どちらもすべてのパーツをエクスポートする方法を変更する必要があります。
私が疑問に思っているのは、MEF2 が MEF1 のようにメタデータをエクスポートする方法を提供するかどうかです: カスタム メタデータ属性を作成し、そのメタデータをパーツに関連付けられたすべてのエクスポートに適用します。これは可能ですか?
c# - MEF2 でパーツを除外するにはどうすればよいですか?
.NET Framework をターゲットとするコードから .NET Core にコードを移植しようとしていますが、これには MEF1 から MEF2 への切り替えが含まれます。.NET Core での MEF の使用に関するドキュメントはそれほど多くないようです。また、MEF1 で可能だったようにパーツを除外する方法を示す例も見つかりません。
元のコード (MEF1 を使用) では、アセンブリのセットからエクスポートされたMockCommunicationService
. これを次のように実装しました。
これに相当するのは MEF2 では何ですか? おそらく を使用する必要があると思いますが、「 xConventionBuilder
以外のすべてを許可する」という行に沿って規則を定義する方法があるかどうかはわかりません。
理想的には、次のようなものが素晴らしいでしょう: