1

MEFの公式ドキュメントから:

構成可能パーツには、少なくとも1つのエクスポートが含まれている必要があります。
構成可能なパーツは、明示的にコンテナに追加されるか、カタログを使用して作成されます。
MEFに同梱されているデフォルトのカタログは、エクスポート属性の存在によって構成可能パーツを識別します。

これは、デフォルトのカタログを使用する場合、何もエクスポートしないため、同じドキュメントからのこのスニペットが機能しないことを意味しますか?

class Program
{
  [Import]
  public IMessageSender MessageSender { get; set; }
}

MEFミックスに参加しているすべてのクラスが、単に「消費」したい場合でも、すべて「食べ物をテーブルに持ってくる」必要があるとは信じがたいです。
上記Programは簡単な例です。このクラスがMEFミックスに追加できるものはありません。

第二に、
パーツはどのように「明示的にコンテナに」追加されますか?たとえば、 CompositionContainer
のドキュメントは、これ以上役に立ちません。

よろしくお願いします1月

4

2 に答える 2

2

構成可能なパーツは、別のパーツにインポートできるパーツです。ここでの例:

class Program
{
    [Import]
    public IMessageSender MessageSender { get; set; }
}

Program構成可能な部分ではありません。iselfは自動的に別のパーツにインポートされません。のエクスポートIMessageSenderは構成可能なパーツです。

を使用してコンテナにパーツを明示的にCompositionBatch追加できます。これにより、コンテナExportComposablePartインスタンスを明示的に追加できます。または、拡張機能を使用して、生の値を追加できます。

var user = new User() { Name = "Matt" };
var batch = new CompositionBatch();
batch.AddExportedValue(user);

CompositionContainer.Compose(batch);

最後の呼び出しは、コンテナにパーツを追加することです。

于 2011-07-14T11:29:22.730 に答える
0

あなたの例では、プログラムはcontainer.SatisfyImports();を取得できるようにするために呼び出す必要がありますIMessageSender

また、インターフェイスで継承されたエクスポートを使用できるため、そのインターフェイスを実装するすべてのものが自動的にエクスポートされます。

[InheritedExport]
public interface IMessageSender
{
}

ここで私のコードを参照してください:MEFMVVMCS.zip

于 2011-07-13T21:05:41.593 に答える