1

タイプ(一般的なエクスポートなど)だけでなく、値でもエクスポートをパラメータ化できるようにしたいと思います。

何かのようなもの:

    class Greeter
    {
        readonly string _format;
        public Greeter( string format ) { _format = format; }

        public string Greet( string name ) { return string.Format( _format, name ); }
    }

    // ...

    var e = new ExportProvider();
    e.ExportParametrized<Greeter>( args: new[] { "Hi, {0}!" } );
    e.ExportParametrized<Greeter>( args: new[] { "¡Hola, {0}!" } );

    // And then:
    [ImportMany] IEnumerable<Greeter> Greeters { get; set; }

    foreach( var g in Greeters ) Console.WriteLine( g.Greet( "John" ) );

    // Should print out:
    //   Hello, John!
    //   ¡Hola, John!

と尋ねられるかもしれません:なぜ私は単にとnew Greeter( "Hello, {0}!" )を使用しComposablePartExportProviderて値をエクスポートしないのCompositionBatchですか?
このアプローチはこの特定のケースでは機能しますが、重要な欠陥がありますGreeter。クラスに独自のインポートがある場合、それらは満たされません。

これについて私が行う通常の方法は、2つのクラスを宣言することです-EnglishGreeterSpanishGreeter、両方をから継承し、Greeterベースコンストラクターの呼び出しで適切な引数を提供します。

しかし、これは2つの理由で機能しません。

  1. これは書くのにたくさんのノイズです。シバン全体を入力する必要があるだけでなく、それらのクラスの名前も考え出す必要があります。名前を付けることは必ずしも意味がありません。DRYの原則は言うまでもありません。しかし、ノイズ以外にも...
  2. 時々私はパラメータを前もって知らない。たとえば、私の挨拶の形式は、ある種の設定ファイルからのものだったとしましょう。

これが私が探しているものをいくらか明確にするための別の考えです。
この問題は、でほぼ解決されていTypeCatalogます。ほら、TypeCatalogタイプについて知っていて、タイプのコンストラクターを呼び出して、オンデマンドでパーツを作成します。
このプロセスは別の観点から考えることができます。カタログにはファクトリ機能があります。その関数を使用して、パーツを作成し、必須ではないインポートを満たしてから、パーツをリクエスターに返します。
さて、の特定のケースでTypeCatalogは、ファクトリ関数はたまたま型自体のコンストラクタです。ファクトリー機能を自分のものに接続して置き換えることができ、それでも残りの機械を活用できれば、まさにそれが私が探しているものです。

4

1 に答える 1