Какой тип данных я должен использовать для изображения в моей модели домена? - PullRequest
2 голосов
/ 28 марта 2009

Я использую Silverlight с подходом DDD. У меня есть объект домена Person, который имеет такие свойства, как FirstName, LastName, Address и т. Д. У Person должно быть изображение.

Каков наилучший способ справиться с этим?

Я действительно не хочу помещать свойство Windows.Controls.Image в объект Person, потому что это будет связано с Silverlight / WPF, и я мог бы захотеть использовать этот объект с некоторыми другими технологиями в будущем (ASP, WinForms, следующая новинка и т. Д.).

Мне также нужно иметь возможность сохранять и загружать изображение где-нибудь. Рекомендуется ли сохранять изображение в базе данных или в файловой системе? В настоящее время я использую nHibernate с Microsoft SQL Server, но я также хочу иметь возможность поддерживать nHibernate с mySql и, возможно, с некоторыми другими базами данных. Также возможно, что когда-нибудь я захочу заменить nHibernate структурой сущностей или какой-либо другой технологией (я абстрагирую это с помощью репозитория).

Учитывая эту информацию, как мне обращаться с изображениями для моей персоны?

Ответы [ 5 ]

5 голосов
/ 28 марта 2009

Ну, byte[] (или что-то, обертывающее byte[]) достаточно переносимо ... большинство всего остального будет зависеть от реализации.

Re database vs file ... для целей клиентских приложений (Silverlight, WPF и т. Д.) Я бы, вероятно, представил их через веб-страницу, а не через вызов WCF (и т. Д.) - то есть некоторый обработчик ASP.NET (или ASP.NET MVC route), который возвращает изображение через HTTP-вызов. Тогда все, что вам на самом деле нужно в клиенте, - это путь к изображению (/people/images/12345 или что-то еще).

Для хранилища - обычно это нормально ... в SQL Server 2008 вы можете одновременно использовать оба типа файловых потоков. Одной из проблем хранения BLOB-объектов в базе данных является увеличение размера, но несколько (маленьких) изображений обычно не повредят (если вы не используете SQL Express и не имеете ограниченный размер БД). Но использование базы данных имеет то преимущество, что в одну резервную копию входит все.

Сказав это, хотя: почти каждая реализация, которую я сделал, как это, использовала файлы.

2 голосов
/ 29 марта 2009

Используете ли вы двоичный двоичный объект для чего-либо? Если нет, передайте ссылку на что-то в файловой системе. Я бы побеспокоился, если ты начнешь носить с собой byte[] или что-то еще.

Если вы WPF, все принимает URI в качестве источника изображения:

BitmapImage pic = new BitmapImage(new Uri("YourAssembly;components/images/something.jpg"));

Имейте в виду, что если вы пойдете по моему предложенному маршруту и ​​переместите его в Silverlight, вам понадобится файл crossdomain.xml в домене, с которым вы выводите эти вещи.

Если вам нужно возиться с двоичным двоичным объектом, сохраните все это как Stream некоторой формы, и ваш класс Person.Image предложит способ получить StreamReader / StreamWriter как GetImageStream() , Тогда ваша база данных может получить StreamReader и записать ее в базу данных. Без проверки, я думаю, что почти каждая база данных, в которой есть двоичные двоичные объекты, записываются с использованием Stream, а не byte[].

... Просто некоторые мысли. Не забывайте, что BitmapImage также позволяет вам подключиться к его потоку, но вам придется посмотреть это в документации :-) Надеюсь, это поможет.

1 голос
/ 29 марта 2009

Я бы пошел с файловой системой по нескольким причинам:

  1. Вам не нужно хранить тип изображения в отдельном поле (BMP? JPEG? PNG?)
  2. У вас есть возможность использовать легкий, точно настроенный сервер для обслуживания ваших изображений (или несколько, если это требуется для масштабирования)
  3. Вам не нужно связываться с байтами [] в вашем коде - просто используйте строку
  4. У вас будет меньше проблем, если вы решите изменить базу данных - вы даже сможете обойтись сценариями INSERT для ваших миграций
1 голос
/ 29 марта 2009

Лучшая практика - заключать сложные решения. Определите свой собственный класс Image и скройте реализацию.

Если вы не пишете приложение для редактирования изображений, доменная часть вашего класса Image будет тонкой Представление и хранение находятся не в классе изображений вашего домена, а в адаптерах.

0 голосов
/ 29 марта 2009

Хм, есть System.Drawing.Image, который в значительной степени не зависит от технологии. Он представляет именно то, что вы хотите (imo): что-то, что может быть загружено / сохранено из / в некоторый поток в каком-то известном формате изображения и которое может быть отображено на экране (в WinForms или WPF).

...