Лучшие практики для изображений в модели с Castle ActiveRecord / MonoRail

Наша «пользовательская» модель нуждается в небольшом профиле, и я не совсем уверен, как с этим справиться. Конечно, мы могли бы просто сохранить его в папку на диске и сохранить путь / имя файла к базе данных, но я думаю, что я бы предпочел сохранить его в самой БД.

Моя первая мысль заключалась в том, чтобы иметь свойство на модели, подобное этому:

[Property] 
public byte[] ProfilePicture
{
  get;
  set;
}

Но мне кажется, что мне придется пройти ДЛИННЫЙ способ заставить его работать таким образом - получить массив байтов из базы данных, а затем преобразовать его в изображение с помощью какого-то обработчика.

Кто-нибудь видел хороший учебник о том, как справляться с такими вещами? Похоже, что это было бы достаточно распространенным требованием, чтобы я нашел что-то специфическое для MonoRail, но пока мои поиски оказались пустыми.


person Jake Stevenson    schedule 27.07.2009    source источник


Ответы (1)


О хранении изображений в базе данных или файлах см. в этом вопросе.

Если вы решили сохранить его в БД, самое главное, чтобы вы не извлекали byte[] каждый раз, когда запрашиваете пользователя, это может быть потенциально большим объемом данных и проблемой производительности. Для этого вы можете либо сохранить изображение в другой таблице, либо сопоставить byte[] с другим объектом с той же таблицей (при условии, что у пользователя может быть только одно изображение):

[ActiveRecord("users")]
public class UserWithoutPicture {
  [PrimaryKey]
  public virtual int Id {get;set;}
...
  [BelongsTo]
  public virtual UserProfilePicture ProfilePicture {get;set;}
}

[ActiveRecord("users")]
public class UserProfilePicture {
  [PrimaryKey]
  public virtual int Id {get;set;}

  [Property]
  public virtual byte[] Image {get;set;}
}

Тем не менее, это могло бы привести к некоторому фанковому поведению. Например, для любого данного пользователя ProfilePicture никогда не будет нулевым. На самом деле вы не стали бы вставлять или удалять UserProfilePicture, поскольку это на самом деле пользователь, вместо этого вы всегда будете обновлять. И вам потребуется дополнительное соединение, и вы должны знать о ВЫБРАТЬ N + 1. Это просто вне моей головы, совершенно непроверено.

Вывод: хранить изображения в другой таблице гораздо удобнее.

Если вам нужно удобство работы с Image вместо сырого byte[] используйте IUserType. Но помните, что Image - это IDisposable, и будет очень сложно удалить его в нужное время.

Реализовать контроллер монорельсовой дороги, который возвращает изображение, довольно просто ... просто используйте [ARFetch], чтобы получить UserProfilePicture по идентификатору и записать в поток ответа с соответствующим типом содержимого.

person Mauricio Scheffer    schedule 28.07.2009