を呼び出すDispose
と、 の作成に関係するExportLifetimeContext<T>
任意の部分で dispose が呼び出されます。コンポーネントは破棄されません。のインポートを満たすためだけにパーツがインスタンス化された場合、他のインポートでは使用されないため、安全に破棄できるため、これは安全な動作です。NonShared
T
Shared
NonShared
T
あなたがそれを達成できると私が思う他の唯一の方法は、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.
}
}
ちょっと汚い感じ…