4

我正在创建一个 .NET API,我的一个方法返回一个 .NET API StreamStream当调用者处理我返回的类时,我需要确保处理其他一些类。

我能想到的唯一方法是创建一个包装类,该类继承Stream并附加我需要的功能,将其他所有内容委托给底层Stream.

我不喜欢仅仅因为它可能会在未来的 .NET 版本中获得新成员而不得不装饰框架类,我需要更新我的 API 以支持这些成员。

有一个更好的方法吗?

例子

这是一个具体的例子供您思考。

请记住,此类的要求之一是它不能要求处置,请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

2

组合而不是继承?

这就是 .Net 对 StreamReader 等项目的处理方式。基本流有一个成员属性,而不是从流继承。

但是,如果要使用现有类型,如 StreamReader/Writer、TCPClient 等,您将无法继承 Stream。

于 2013-06-25T19:51:41.113 回答
0

您将需要创建一个包装器。当流被释放时,没有办法得到通知。其他一些类型可能会提供一个公共事件,当它们被释放时会触发,但Stream不会。

于 2013-06-25T19:51:13.670 回答