特定のファイル形式を読み取るアプリケーションがあります。さらに、アプリケーションは、代替ファイル形式を読み取り、ツールがネイティブにサポートする標準化された形式に変換する「プラグイン」をサポートします。
次のようなインターフェイスを定義したいと思います。
/// <summary>
/// Interface for file transformer. Implementers of this interface provide a means to
/// convert a given file into Foo Format.
/// </summary>
public interface IFileTransformerPlugin
{
/// <summary>Gets the name of the transformer to display to the user.</summary>
/// <value>The name of the transformer displayed to the user.</value>
string DisplayName
{
get;
}
/// <summary>Determines if this transformer can handle the given format.</summary>
/// <remarks>
/// This method should return very quickly; reading only a small portion of the
/// input stream. This method is intended to be a rough cut check -- returning true
/// does not necessarily mean that the file will parse successfully on full load.
/// </remarks>
/// <param name="fileContents">The file contents.</param>
/// <returns>
/// true if this transformer can handle the supplied format, false otherwise.
/// </returns>
bool CanHandleLogFormat(Stream fileContents);
/// <summary>Transforms a file into Foo Format.</summary>
/// <param name="inputFile">The input log stream.</param>
/// <param name="outputFile">The output log stream (where the output should be
/// written).</param>
/// <returns>A transformation result which includes error information.</returns>
LogTransformationResult Transform(Stream inputFile, Stream outputFile);
}
問題は、ストリームを取得する変換メソッドに起因します。概念的には、プラグインではなくプラグインホストにこれらのストリームを「所有」させ、IDisposeまたはこれらのストリーム上のあらゆるものを呼び出す責任を負わせたいと思います。たとえば、テストシナリオでは、呼び出し元がMemoryStreamを出力として渡して、出力が有効であることを確認できると便利です。
ただし、プラグインの作成者として、フレームワークで上位レベルのフォーマット構造を使用できることが望ましいです。つまり、TextReader / TextWriter; XmlTextReader / XmlTextWriter; ただし、これらのクラスは、基になるストリームの所有権を取得し、ストリームを提供するコードが何をするかに関係なく、基になるストリームでDisposeを呼び出します。(少なくとも、それらのクラス自体が正しく配置されていると仮定します)
この問題を回避するために、このインターフェイスをどのように作り直すことができますか?それも解決可能な問題ですか?