4

私が知っているように、変数が宣言されている場合、プロパティLazyを使用するとそのコンストラクターが呼び出されValueます。

このインスタンスにいくつかのパラメーターを渡す必要がありLazyますが、正しい構文が見つかりません。これは私のデザインではありません。私は MEF を使用しています。私のパーツのインスタンスがExportFactory返されます。Lazy私のパーツにはコンストラクターがあり、いくつかのパラメーターを使用してこれらのコンストラクターを呼び出す必要があります。

4

2 に答える 2

9

Func代わりに独自のものをエクスポートできます。

public class FooFactory
{
    [Export(typeof(Func<string,int,ExportLifetimeContext<IFoo>>))]
    public ExportLifetimeContext<IFoo> CreateFoo(string param1, int param2)
    {
        Foo foo = new Foo(param1, param2);
        return new ExportLifetimeContext<IFoo>(foo,
            delegate
            {
                // Clean-up action code goes here. The client might not be able 
                // to do this through the IFoo interface because it might not
                // even expose a Dispose method.
                //
                // If you created other hidden dependencies in order to construct
                // Foo, you could also clean them up here. 
                foo.Dispose();
            });
    }
}

他の場所にインポートします。

[Export(typeof(ISomething))]
public class FooUser : ISomething
{
    private readonly Func<string,int,ExportLifetimeContext<IFoo>> fooFactory;

    [ImportingConstructor]
    public FooUser(Func<string,int,ExportLifetimeContext<IFoo>> fooFactory)
    {
        this.fooFactory = fooFactory;
    }

    public void DoSomething()
    {
        using (var fooLifetime = this.fooFactory("hello", 3))
        {
            IFoo foo = fooLifetime.Value;
            ...
        }
    }
}

クリーンアップ アクションが必要ない場合は、すべてのExportLifetimeContextものを捨てることで、これを大幅に簡素化できます。

ただし、一部の実装はIFoo破棄可能 (または他の破棄可能オブジェクトに依存) である場合もあれば、そうでない場合もあります。したがって、最も正しいことは、「このオブジェクトを使い終わった」というシグナルを抽象化に組み込むことExportLifetimeContextです。

于 2010-12-09T15:05:42.093 に答える
2

MEF には、ExportFactory を使用してパーツを作成するときに、コンストラクター パラメーターをパーツに渡す組み込みの方法がありません。Wim Coenenが提案するようなものは、おそらくあなたが望むものを達成するための最良の方法です.

于 2010-12-09T16:31:48.537 に答える