4

.NET4.0ベータ2の新しいSystem.ComponentModel.Composition名前空間で遊んでいます。これはManagedExtensibilityFrameworkとも呼ばれます。

インポートが:をMonkeyインポートする次のC#の例を使用します。Banana

public interface IBanana 
{ 
}

[Export(typeof(IBanana))]
public class Banana : IBanana 
{ 
} 

public class Monkey
{
    [Import(typeof(IBanana))]
    public IBanana Banana { get; set; }
}

ただし、次のようにサルを作成しようとすると、「このオブジェクトは初期化されていません。プロパティ'SourceProvider'を設定する必要があります。InvalidOperationExceptionというメッセージが表示されます。

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
var monkey = new Monkey();
container.ComposeParts(monkey);

ここで何が欠けていますか?カタログをCatelogExportProviderでラップせずに直接渡すことができることは知っていますが、上記も機能しないのでしょうか。

4

1 に答える 1

5

CatalogExportProvider には、コンテナーへの参照が必要です。次のコードが機能するはずです。

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana)));
var container = new CompositionContainer(exportProvider);
exportProvider.SourceProvider = container;
var monkey = new Monkey();
container.ComposeParts(monkey);

カタログをコンストラクターに渡すと、コンテナーはこれを自動的に行います。CatalogExportProvider を手動で作成する理由はあまりないと思います。

CatalogExportProvider がコンテナーへの参照を必要とする理由は、コンテナーが接続されている他のエクスポート プロバイダーによって満たされる必要があるインポートを含むパーツがカタログに存在する可能性があるためです。

于 2009-12-17T21:53:12.303 に答える