.NET API を作成していますが、メソッドの 1 つが .NET を返しますStream
。呼び出し元がStream
返された を破棄するときに、他のクラスが破棄されるようにする必要があります。
これを行うために考えられる唯一の方法は、必要な機能を継承して追加するラッパー クラスを作成し、Stream
他のすべてを基になる に委譲することですStream
。
将来の .NET リリースでサポートするために API を更新する必要がある新しいメンバーを取得する可能性があるという理由だけで、フレームワーク クラスを装飾する必要はありません。
これを行うより良い方法はありますか?
例
これがあなたの熟考のための具体的な例です。
例のクラスを参照して、このクラスの要件の 1 つは、破棄を要求できないことであることに注意してくださいContentSource
。
public class ContentSource
{
public Stream OpenRead()
{
var entry = GetEntry();
// TODO: Ensure that when the stream we return is disposed, we also dispose of `entry.Archive`.
return entry.Open();
}
private ZipArchiveEntry GetEntry()
{
ZipArchive archive = null;
try
{
archive = new ZipArchive(_zipContent.OpenRead(), ZipArchiveMode.Read, false);
var entry = archive.GetEntry(_entryName);
if (entry == null)
{
throw new InvalidOperationException("Specified entry was not found in the ZIP archive. " + _entryName);
}
return entry;
}
finally
{
if (archive != null)
{
archive.Dispose();
}
}
}
}
ストリーム ラッパーの例
これは、私が満足していないと考えることができる解決策です。
public sealed class DependencyDisposingStreamWrapper : Stream
{
private readonly Stream _stream;
private readonly IDisposable _dependency;
private bool _disposed;
public DependencyDisposingStreamWrapper(Stream stream, IDisposable dependency)
{
_stream = stream;
_dependency = dependency;
}
# region - Overrides of all Stream members, delegating to underlying stream -
// ...
#endregion
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_dependency.Dispose();
}
base.Dispose(disposing);
_disposed = true;
}
}
}