使用Castle ActiveRecord / MonoRail的模型中图像的最佳实践

时间:2009-07-27 04:37:55

标签: castle-activerecord castle-monorail

我们的“用户”模型上需要一张小型的图片,我并不完全确定如何处理它。当然我们可以将它保存到磁盘上的文件夹并将路径/文件名存储到数据库中,但我想我宁愿将它存储在数据库本身中。

我的第一个想法是在模型上拥有这样的属性:

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

但是我确实觉得我必须采用这种方式让它以这种方式工作 - 从数据库中获取一个字节数组,然后将其转换为具有某种处理程序的图像。

有没有人看过如何处理这类事情的好教程?似乎这是一个很常见的要求,我会发现MonoRail特有的东西,但到目前为止,我的搜索结果是空的。

1 个答案:

答案 0 :(得分:1)

关于在数据库或文件上存储图像,请参阅this question

如果您决定将其存储在数据库中,最重要的是每次查询用户时检索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,因为它实际上是用户,而是你总是会更新。而且你需要额外加入,你必须知道SELECT N+1。这只是我的头脑,完全未经测试

结论:将图像存储在另一个表格中要灵活得多。

如果您希望方便处理Image而不是原始byte[],请实施IUserType。但请记住,Image是一个IDisposable,并且非常难以在适当的时候处理它。

实现返回图像的Monorail控制器非常简单......只需使用[ARFetch]通过id获取UserProfilePicture并使用适当的内容类型写入Response流。