2012-02-28 75 views
11

我有一个接口定义为:可以将流传递给多个方法吗?

public interface IClientFileImporter 
{ 
    bool CanImport(Stream stream); 
    int Import(Stream stream); 
} 

的想法是采取任何文件流,并通过一系列这个接口的实现的运行它来确定哪一个应该处理该文件。一些实现可能会寻找一定的标题行,而其他人可能会寻找一定的字节序列,等等

我的问题是,是否确定,只要通过周围流这样的,因为我从来没有关闭它?每种方法都必须负责将流重置为位置0(如有必要),但还有其他潜在问题(除了线程安全性)吗?这个代码真的很气味,国际海事组织,但我不知道有一个更好的方法来做到这一点。

+0

我认为这不是一个坏概念。您不知道流中需要哪些实现,因此提供整个流是有意义的。为了确保实现不会混淆流,你可以实现某种类型的包装(从流本身派生),该包装禁止修改底层流或任何你需要的任何方法。另外,我不需要实现来重置流的位置。 CanImport/Import的调用者可以做到这一点。综合这可以确保没有importorr可以伤害基础流。 – 2012-02-28 20:41:17

回答

3

为了防止底层流不被修改,创建一个从流派生并只转发安全调用包裹流的包装流。另外,不要假设Import/CanImport方法重置流的位置。这些方法的调用者应该在将流传递给Import/CanImport之前将其重置为有效状态。

+0

在这个只读流包装器中,重写Dispose方法以自动倒回流但不关闭它会好吗? – Chris 2012-02-28 21:16:10

+0

是的,这当然可以工作,这样你可以使用一个方便的使用块来调用CanImport/Import – 2012-02-28 23:17:27

2

如果每个函数返回流只是它得到它的方式,我不认为有它的问题。

+0

为什么该方法不能修改流?我认为从流中读书和写作是你传递它的原因。 – cadrell0 2012-02-28 20:41:00

+0

如果它修改了流,你可以进入函数之间的各种依赖关系。它可以,但是OP每次谈到倒带流。 – zmbq 2012-02-28 20:42:33

2

这应该不是问题。

虽然我可能会重新调整它稍微:

public interface IClientFileImporter 
{ 
    int Import(Stream stream); 
} 

然后我会在导入方法返回-1,如果它不能够。可以让你的其他代码更简单一些。

+0

我同意克里斯,很好的回答克里斯。我认为这会让它更容易 – 2012-02-28 20:46:55

0

将相同的流传递给多个方法是完全正确的。

谨防非寻求-能流 - 有你不能复位位置流。 Andre Loker的评论有很好的建议来包装Stream,所以CanImport方法不会混淆实际的流。

你也可以考虑明确规定流于CanImport方法的一些“标题”部分,也将会使他们失去了弹性。

0

如果您担心会传递流,因为您最终可能会运行可能不可信的外部代码,那么您可以做的最好的方法是创建一个新的只读流并传递它,以便不需要外部代码改变文件的内容,直到你确定要让它们。

public class ReadonlyStream : Stream 
{ 
    public ReadonlyStream(Stream baseStream) 
    { 
     ownerStream = baseStream; 
    } 

    private Stream ownerStream; 

    public override bool CanWrite 
    { 
     get { return false; } 
    } 

    public override int Write(byte[] bits, int offset, int count) 
    { 
     throw new InvalidOperationException(); 
    } 

    // Other code ommitted 
} 
相关问题