質問

私は、新しい<のhref = "http://msdn.microsoft.com/en-us/library/system.componentmodel.composition(VS.100).aspx" のrel = "nofollowをnoreferrer" で遊んでいます> .NET 4.0ベータ2でSystem.ComponentModel.Composition の名前空間は、またマネージド拡張として知られていますフレームワークでます。

私はMonkeyBananaをインポートし、次のC#の例を使用します。

public interface IBanana 
{ 
}

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

public class Monkey
{
    [Import(typeof(IBanana))]
    public IBanana Banana { get; set; }
}
私は次のように猿を構成しようとすると、

しかし、その後、私はメッセージでInvalidOperationExceptionを得る「のこのオブジェクトは初期化されていない - プロパティ 『をSourceProvider』を設定する必要がありますの。」:

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

私はここで何をしないのですか?私はCatelogExportProviderでラップせずに直接カタログを渡すことができることを承知していますが、上記にも働くべきではないのですか?

役に立ちましたか?

解決

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は、コンテナへの参照を必要とする理由は、コンテナがにフックアップされた他の輸出プロバイダによって満足する必要が輸入して、カタログ内の部品があるかもしれないということです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top