メタデータ フィルタリングと 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 部品番号を取得します。