2

基本的に、によって作成されたインポートを破棄する簡単な方法はありExportFactory<T>ますか? 私が尋ねる理由は、エクスポートには通常、EventAggregator など、まだ存在するものへの参照が含まれているためです。これらを何百も作成し、必要のないときに放置しておくという問題に遭遇したくありません。

ExportLifetimeContext<T>オブジェクトを作成すると、Dispose を含むが返されることに気付きました。ExportLifetimeContextしかし、 ViewModel のコピーを要求する ViewModel に を戻したくはないので、Value を戻します。( return Factory.Single(v => v.Metadata.Name.Equals(name)).CreateExport().Value;)

4

1 に答える 1

0

を呼び出すDisposeと、 の作成に関係するExportLifetimeContext<T>任意の部分で dispose が呼び出されます。コンポーネントは破棄されません。のインポートを満たすためだけにパーツがインスタンス化された場合、他のインポートでは使用されないため、安全に破棄できるため、これは安全な動作です。NonSharedTSharedNonSharedT

あなたがそれを達成できると私が思う他の唯一の方法は、Disposeメソッドをカスタマイズして、破棄呼び出しをインポートする他のメンバープロパティにチェーンすることです。

[Export(typeof(IFoo))]
public class Foo : IFoo, IDisposable
{
    [Import]
    public IBar Bar { get; set; }

    public void Dispose()
    {
        var barDisposable = Bar as IDisposable;
        if (barDisposable != null) 
            barDisposable.Dispose();
    }
}

ただしIBar、インポートされたインスタンスが であるか、SharedまたはNonShared共有コンポーネントを破棄するリスクがあるかどうかをタイプが認識できないためです。

のインスタンスにぶら下がることExportedLifetimeContext<T>が、あなたが望むものを達成する唯一の安全な方法だと思います。

これが役立つかどうかはわかりませんが、不要なラッピングのように感じますが、可能性があります:

public class ExportWrapper<T> : IDisposable
{
  private readonly ExportLifetimeContext<T> context;

  public ExportWrapper<T>(ExportLifetimeContext<T> context)
  {
    this.context = context;
  }

  public T Value 
  {
    get { return context.Value; }
  }

  public void Dispose()
  {
    context.Dispose();
  }

  public static implicit operator T(ExportWrapper<T> wrapper)
  {
    return wrapper.Value;
  }

  public static implicit operator ExportWrapper<T>(ExportLifetimeContext<T> context)
  {
    return new ExportWrapper<T>(context);
  }
}

あなたがおそらくできること:

[Import(typeof(IBar))]
public ExportFactory<IBar> BarFactory { get; set; }

public void DoSomethingWithBar()
{
  using (ExportWrapper<IBar> wrapper = BarFactory.CreateExport())
  {
    IBar value = wrapper;
    // Do something with IBar;
    // IBar and NonShared imports will be disposed of after this call finishes.
  }
}

ちょっと汚い感じ…

于 2011-07-01T18:46:33.730 に答える