Могу ли я вернуть FileStream как общий интерфейс к файлу? - PullRequest
1 голос
/ 04 мая 2010

Я пишу интерфейс класса, который должен возвращать ссылки на двоичные файлы. Обычно я предоставляю ссылку на файл как путь к файлу. Однако я рассматриваю возможность хранения некоторых файлов (например, небольшого эскиза) в базе данных напрямую, а не в файловой системе. В этом случае я не хочу добавлять дополнительный шаг чтения миниатюры из базы данных на диск и затем возвращать путь к файлу для моей программы для чтения. Я хотел бы передать изображение непосредственно из базы данных в мою программу и избегать записи чего-либо на диск, если пользователь явно не хочет что-то сохранить.

Имеет ли смысл иметь мой интерфейс, возвращающий FileStream или даже Image? Затем класс реализации должен определить, является ли источником FileStream или Image файл на диске или двоичные данные в базе данных.

public interface MyInterface
{ 
    string Thumbnail {get;}
    string Attachment {get;}
}

против

public interface MyInterface
{ 
    Image Thumbnail {get;}
    FileStream Attachment {get;}
}

Ответы [ 4 ]

2 голосов
/ 04 мая 2010

Можно. Однако я бы изменил интерфейс так, чтобы он выглядел так:

public interface MyInterface
{ 
    Image CreateThumbnail();
    FileStream CreateAttachment();
}

Это разрешает любую двусмысленность относительно времени жизни возвращаемых объектов; например, держать их подальше от вас.

2 голосов
/ 04 мая 2010

Вы можете вернуть объект Stream, который передается в файл или базу данных

1 голос
/ 04 мая 2010

Для небольшого контента, где использование понятно, как миниатюра, я думаю, что вам лучше будет вернуть тип, как он будет использоваться (т.е. изображение). Если у вас большой контент, цель которого может отличаться или у вас могут быть причины для его частичного чтения, тогда Stream - это то, что нужно. В любом случае источник контента скрыт от пользователя класса. Вы также захотите рассмотреть семантику удаления потока и то, хотите ли вы, чтобы пользователь класса контролировал, как долго соединение с базой данных остается открытым.

1 голос
/ 04 мая 2010

Вы можете использовать byte[] для представления файла, если его размер не очень большой и помещается в память. В противном случае Stream - это хорошо, но убедитесь, что вы реализовали IDisposable для его правильного освобождения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...