4

.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;
        }
    }

}
4

2 に答える 2