オブジェクト インスタンスがあり、特定のインターフェイス タイプとしてエクスポートされた、そのオブジェクト インスタンスを含む MEF カタログを作成したいと考えています。これどうやってするの?
TypeCatalogは、(a) 既存のインスタンスを使用する代わりに新しいインスタンスを作成し、(b) タイプに [Export] 属性が必要であるため、ここでは機能しないようです。私の場合、インスタンスは MEF のメタデータ システムから取得されるため、MEF は基になる型を作成し、それに属性を追加することはできません。
私が知る限り、通常のアドバイスは、既存のインスタンスがある場合は、それをcontainerに追加する必要があります (たとえば、 CompositionBatchを介して)、catalogには追加しないでください。しかし、このインスタンスを追加すると、AssemblyCatalog 相当の型もすべて同じ操作で追加されます。また、後でこれらのタイプをすべて削除できるようにしたいと考えています。すべてを AggregateCatalog にバンドルする方が理にかなっています。こうすることで、アセンブリとインスタンスの両方を 1 回のアトミック操作で追加したり、同じ方法でそれらをすべて削除したりできます。
例えば:
// Bootstrapper code to initialize MEF:
public void Configure() {
_selectedGameCatalog = new AggregateCatalog();
var globalCatalog = new AggregateCatalog(_selectedGameCatalog);
_container = new CompositionContainer(globalCatalog);
// ... more MEF initialization ...
}
// Sometime later, I want to add more stuff to the MEF ecosystem:
public void SelectGame(Lazy<Game, IGameMetadata> entry) {
var newCatalog = new AggregateCatalog();
// Make the assembly available to import:
newCatalog.Catalogs.Add(new AssemblyCatalog(entry.Value.GetType().Assembly));
// I also want the metadata to be available to import:
IGameMetadata metadata = entry.Metadata;
newCatalog.Catalogs.Add(MakeCatalogFromInstance<IGameMetadata>(metadata));
// Replace whatever game was selected before:
_selectedGameCatalog.Catalogs.Clear();
_selectedGameCatalog.Catalogs.Add(newCatalog);
}
やり方がわからないのは「MakeCatalogFromInstance」です。既存のインスタンス (特定のタイプとして登録されている) を含むカタログを作成するにはどうすればよいですか?
または、代わりに、私がこれについてすべて間違っている場合、カタログ全体と既存のインスタンスをすべて同時に MEF にプラグインし、後でそれらをすべて再度プラグインして何かに置き換える機能を備えた、より良い方法はありますか?そうしないと?