Можно ли ограничить / потребовать определенные возможности в параметре Stream? - PullRequest
2 голосов
/ 17 июля 2010

Я пишу приложение, которое создает каталоги файлов.В настоящее время информация каталога хранится в файле XML, но я пытаюсь абстрагировать интерфейс от каталога, чтобы учесть другие будущие механизмы хранения, такие как один ZIP-файл, сервер SQL или сервер HTTP.Таким образом, вместо возврата пути к файлу абстрактный класс Catalog возвращает файлы в виде байтовых потоков.Таким образом, позволяя источником файла быть диском, но также и для файлов, поступающих из базы данных или веб-сервера.См. Мой предыдущий связанный вопрос .

Однако корневой класс Stream включает потоки с различными возможностями.Некоторые потоки могут быть только прочитаны, другие могут быть только записаны.Тем не менее, некоторые потоки поддерживают поиск, а другие - нет.

Есть ли способ ограничить возможности возврата потока свойством или методом?Например, мой класс Catalog выглядит примерно так:

public abstract class Catalog
{
    ...
    public abstract Stream File
    {
        get;
    }
    ...
}

Есть ли какой-нибудь способ гарантировать, что File всегда будет возвращать читаемый поток, который поддерживает поиск?

Ответы [ 2 ]

1 голос
/ 17 июля 2010

Ну, вы можете проверить свойства потока CanRead, CanWrite и CanSeek.

Я не уверен, что правильно понял ваш вопрос, хотя ... Что вы пытаетесь сделать точно?

Некоторые потоки никогда не будут доступны для поиска (например, NetworkStream, GZipStream ...), поэтому, если вы работаете с такими типами потоков, нет способа заставить их искать.

Если вы просто хотите ограничить функциональность потока (например, запретить запись в поток, который обычно доступен для записи), вы можете создать оболочку, которая делегирует свою реализацию базовому потоку, но выдает исключение для «отключено». "методы.

0 голосов
/ 17 июля 2010

как насчет абстрагирования основного механизма персистентности.Что нужно вашим абонентам?Если все они нуждаются в одинаковом поведении из вашего «Файла», можете ли вы создать интерфейс, который будут реализованы всеми вашими потенциальными хранилищами, вместо того, чтобы все они возвращали классы «Поток»?

...