2

アプリケーションがあり、MEF を使用して作成しています。インポート後に部品のメタデータ情報を更新できるかどうか知りたいです。

これを行う理由は次のとおりです。インポートされたパーツの名前と typeof(int) プロパティを ListBox に表示し、対応する ListBoxItem が選択されるまで読み込まれません (かなり標準的です)。ここで、あるイベントが発生したときにあるパーツのメタデータ情報を更新したいので、ListBox に表示される情報は「[パーツ名] ([新しい番号])」のようなものです。

メタデータをその情報を定義するインターフェイスとしてインポートしていますが、int プロパティを編集可能に設定すると (設定されたアクセサーを使用して)、構成時に次の例外が表示されます。

"The  MetadataView 'myMetadataInterface' is invalid 
 because property 'myInt' has a property set method."

これを達成する方法はありますか?それとも、部品が作成されると、メタデータは常に読み取られるだけですか?

この質問が奇妙に見えることはわかっていますが、それほど難しくはなく、したがって興味深いものにはなりません ;-)


編集(リーの回答に基づいて、人々を質問の核心に留めるために)

パーツが構成された後、実際に読み込まれる前に Metadata プロパティを更新できるかどうかを知りたいだけです (HasValue == false)。パーツのフィルタリングや検索について心配する必要はありません。

エクスポート インターフェイスにプロパティを追加しました。これは、UI でのみ表示され、更新されることを意図しています。このプロパティには他の機能がなく、パーツはそれによってフィルター処理されません。

ありがとう

4

1 に答える 1

3

メタデータ フィルタリングと DefaultValueAttribute

メタデータ ビューを指定すると、ビューで定義されたメタデータ プロパティを含むエクスポートのみに一致する暗黙的なフィルター処理が行われます。System.ComponentModel.DefaultValueAttribute を使用して、プロパティが不要であることをメタデータ ビューで指定できます。以下に、IsSecure でデフォルト値 false を指定した場所を示します。これは、パーツが IMessageSender をエクスポートするが、IsSecure メタデータを提供しない場合でも、一致することを意味します。

引用

ショートバージョン(質問編集後に編集)。

実行時にメタデータを更新する必要はありません。更新する必要があり、mef パーツに属するデータがある場合は、再コンパイルして更新するか、そのデータを dll の外部の柔軟なストレージに格納するかを選択する必要があります。行った変更を再コンパイルせずに dll に格納する方法はないため、これは設計上の欠陥です。

前の投稿。

ビューの値を変更すると、ロードされたコンポーネントについてうそをつくことになります。確かに、メタデータは、初期化された値を返すオブジェクトへの単なるインターフェイスです。これらの値を技術的に更新できることは確かですが、それはメタデータの目的ではありません。

Nameのインスタンスのフィールドを変更することはありませんType。なぜだめですか?メタデータだから。実行時にメタデータを更新するということは、実際のデータのインスタンスの性質が何らかの形で変更されたことを意味します。

このコード行は、可能であれば、Triple タイプを導入しません。

typeof(Double).Name = "Triple";
var IGotATriple = new Triple();

値を変更したい場合は、その情報を使用して別のオブジェクトを作成し、それにバインドするだけです。メタデータはコンパイルされます。パーツのロード後に変更しても、パーツのソースは何も変更されないので、嘘をつくことになります。(ソースコードにアクセスし、そこで変更して再コンパイルしない限り)。

例を見てみましょう:

[Export(typeof(IPart))]
[ExportMetadata("Part Name","Gearbox")]
[ExportMetadata("Part Number","123")]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class GearBoxPart : Part { public double GearRatio ... }

ここで、利用可能な部品とその数を表示する UI があると仮定しましょう。ここで、製造元が何らかの理由で部品番号を変更し、更新したいと考えています。これが可能な場合は、部品番号をマニフェストまたはデータベースに保存することを検討してください。または、部品番号が変更されるたびに再コンパイルする必要があります。

再コンパイルが可能です。上記を実行するコントローラー UI がありますが、メタデータを更新する代わりに、パーツのコードファイルを再構築する要求を送信します。要求は、コードファイルを解析し、部品番号を置き換えてから、バッチ再コンパイルのために送信し、新しい dll を再配布することによって処理されます。それは、IMO のための多くの作業です。

それで、データベースをセットアップします。次に、オブジェクトのメタデータをこれに変更します。

[ExportMetadata("OurCompanyNamePartNumber","123")]

次に、会社が考案した一意の永続的な静的部品番号を現在の部品番号にマップするデータベース/マニフェスト/xml を作成します。コントロール UI を変更すると、database/manifest/xml が更新されます。

<PartMap>
    <PartMapEntry OurCompanyNamePartNumber="123" ManufacturerPartNumber="456"/>
    ...
</PartMap>

次に、エンド ユーザー UI が製造元の部品番号で部品を検索し、mef コードが PartMap を検索して mef 部品番号を取得します。

于 2013-07-31T18:26:03.453 に答える