4

オブジェクト インスタンスがあり、特定のインターフェイス タイプとしてエクスポートされた、そのオブジェクト インスタンスを含む 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 にプラグインし、後でそれらをすべて再度プラグインして何かに置き換える機能を備えた、より良い方法はありますか?そうしないと?

4

2 に答える 2

1

繁栄のために...

MEF は、実際に実行中のオブジェクト インスタンス (コンテナー) から、使用する型情報 (カタログ) の雑用を分離します。私にとっては、特にアプリケーションでより複雑な MEF 環境をセットアップする場合は、論理的な決定です。

その場でコンテナーを「変更」する機能が必要な場合は、階層コンテナーを使用することをお勧めします。ルート カタログ/コンテナーには静的な型が格納され、子コンテナーには、ゲームに必要な特定のメタ型の各セットを格納できます。

役に立てば幸いです、マーク

于 2012-11-15T19:04:54.323 に答える
1

タイプをカタログに追加してから、インスタンスをコンテナに追加するのがおそらく最善だと思います。

カタログにはパーツ定義が含まれています。パーツ定義は、パーツの作成に使用されます。(これの型はComposablePartDefinitionとです。)したがって、理論的には、独自のカタログと、が呼び出されたComposablePartときにインスタンスに対応するパーツを常に返すパーツ定義を作成できます。CreatePartしかし、カタログは実際にはこのように使用されるようには設計されていません。

于 2011-04-11T04:59:23.390 に答える