11

現在、私のWPFアプリケーションはこのような部分をインポートしています

[Import(typeof(ILedPanel)]
public ILedPanel Panel { get; set; }

しかし、これは ILedPanel を実装するクラスの単一のインスタンスを ma に与えます。私が本当にやりたいことは、必要な数のインスタンスを作成できるようにすることです。ソフトウェアに含まれる ILedPanel のエクスポートは、常に 1 つだけであることに注意してください。

(ILedPanel を実装するクラスごとに 1 つのインスタンスを提供する List でインポートを使用する場合)

助言がありますか?

4

6 に答える 6

10

これが Nicolas が言及しているものかどうかはわかりませんが、次のように、インスタンス クラスではなく Factory クラスをインポートできます。

[Import(typeof(ILedPanelFactory)]
public ILedPanelFactory PanelFactory { get; set; }

...そして、コードの後半で...

ILedPanel panel = PanelFactory.BuildPanel();
于 2009-06-04T11:06:08.350 に答える
10

他のすべての回答はかなり古いため、MEF と呼ばれる比較的新しい機能については言及していませんExportFactory。この汎用クラスにより、必要なときにいつでも好きなだけインスタンスをインポートExportFactory<ILedPanel>して作成できるため、コードは次のようになります。

[Import(typeof(ILedPanel)]
public ExportFactory<ILedPanel> PanelFactory { get; set; }

public ILedPanel CreateNewLedPanelInstance()
{
    return PanelFactory.CreateExport().Value;
}

このメソッドは、作成されたパーツが持つすべてのインポートも満たします。ExportFactoryクラスの使用について詳しくは、こちらをご覧ください。

于 2013-11-20T12:37:17.670 に答える
8

現在、MEFにはこれに対する「組み込み」のサポートはありませんが、Service Locatorに戻る前に、ここでいくつかのインスピレーションを見つけることができます:http: //blogs.msdn.com/nblumhardt/archive/2008/12/27/container -managed-application-design-prelude-where-does-the-container-belong.aspx

基本的な考え方は、動的なインスタンス化を行う必要のあるコンポーネントにコンテナを「インポート」することです。

このシナリオのより直接的なサポートは、私たちが調査しているものです。

ニック

更新: MEFはこれを実験的にサポートするようになりました。詳細については、このブログ投稿を参照してください。

于 2009-06-03T23:39:45.860 に答える
5

質問を誤解しない限り、CreationPolicy.NonShared を使用するだけで解決されるようです。

これは、パネルを宣言するコードが、パネルが必要なすべての場所に存在することを前提としています。この宣言 (インポート) を持つすべてのクラスのすべてのインスタンスで、ILedPanel の新しいインスタンスを取得します。

于 2009-07-24T13:32:47.817 に答える
3

MEFに付属しているshapesゲームのサンプルを見ると、ShapeFactoryクラスがあります。

[Export]
public class ShapeFactory
{
    private readonly Random random = new Random((int)DateTime.Now.Ticks);

    [Import]
    private ICompositionService CompositionService { get; set; }

    public IShape GetRandomShape()
    {
        var shapeRetriever = new ShapeRetriever();

        CompositionService.SatisfyImports(shapeRetriever);

        int randomIndex = random.Next(shapeRetriever.PossibleShapes.Length);

        return shapeRetriever.PossibleShapes[randomIndex].GetExportedObject();
    }

    private class ShapeRetriever
    {
        [ImportMany(RequiredCreationPolicy = CreationPolicy.NonShared)]
        public Export<IShape, IShapeMetadata>[] PossibleShapes { get; set; }
    }
}

これは、「オンデマンド」でランダムな形状のインスタンスを作成することを示しています。ILedPanelの実装は1つしか登録されていないことを示唆しているため、ランダムな実装を選択しなくても、同様のことができると思います。

于 2009-07-10T02:22:30.220 に答える
2

このインスタンスでは、依存性注入コンテナーではなく、サービス ロケーターのように MEF を使用したいということだと思います。ValueResolver の例を見てみてください

于 2009-06-03T23:24:54.580 に答える