我正在创建一个.NET API,我的一个方法返回Stream
。当调用者处理我返回的Stream
时,我需要确保处理其他类。
我能想到的唯一方法是创建一个继承自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;
}
}
}
答案 0 :(得分:2)
组成而不是继承?
这就是.Net为诸如StreamReader这样的项目做的事情。有一个基本流的成员属性,而不是从流继承。
如果想使用StreamReader / Writer,TCPClient等现有类型,那么你将无法继承Stream。
答案 1 :(得分:0)
您需要创建一个包装器。处理流时无法通知。其他一些类型可能会提供在处置时触发的公共事件,但Stream
不会。