【问题标题】:How should i lazy-generate a thumbnail image?我应该如何延迟生成缩略图?
【发布时间】:2010-10-25 19:02:23
【问题描述】:

对于背景,我有一个松散地基于Rob Conery's Storefront 模型的数据层和服务层,就像 Rob 的一样,我的许多域对象并与 LazyList<>LazyItem<> 链接以利用延迟鉴于我的Lazy* 类型使用IQueryable<T> 而不是this awesome delegate approach,Linq2Sql 提供的执行。

所以我有一个像这样的对象图(基本上,每个 Activity 都应该有一个包含许多图像的照片库 - 缩略图和全尺寸照片):

latest3Activities[0].Gallery.Images.Inner[1].FullImage

Gallery 类型的 Images 属性为 LazyList<PhotoGalleryImage>,因此该 LazyList 中的 IList<PhotoGalleryImage> 就是您看到的 Inner。每个PhotoGalleryImage 项都有一个FullImage 属性和一个Thumbnail 属性,两者都是Image 类型。

这个想法是将完整的 rez 上传照片存储在 PhotoGalleryImage.FullImage 属性中,最初,Thumbnail 属性是 Null。 我要的是:当第一次访问Thumbnail 属性时,如果是Null,我希望我的服务层生成Thumb,将其保存到数据库,然后返回Image 实例这是较小的照片。我有从全尺寸图像创建缩略图的所有代码,所以这不是这里的问题。

我想不通的是如何捕获Thumbnail 属性的第一次访问(在我的IQueryable<> 架构上下文中),然后让服务层调整大小而不是存储库(DAL)。我强烈认为服务(业务)层应该负责这个功能决策,但我不知道如何使它工作。

目前我认为从存储库中的域类到 Linq2Sql 类的映射将是识别我所指的这种“首次访问”的好地方,但我不知道如何调用较低层进入服务层并执行收缩(或者即使可以,它应该)。

也许我的设计限制了我让 Repos 进行转换。也许我根本不希望服务层执行这个逻辑。也许我的设计太可怕了,我真的不应该面对这个烂摊子。

请帮忙。感谢所有反馈。

【问题讨论】:

  • 请详细说明您将如何使用缩略图图像实例。
  • 好的-在活动的详细视图中,我将通过 ajax 加载相关照片库的拇指(Facebook 是如何做到的)。每个图库图片项都让我可以访问缩略图(用于图像表)和完整尺寸的缩略图(用于当用户单击拇指时)。

标签: asp.net-mvc linq-to-sql domain-driven-design lazy-loading iqueryable


【解决方案1】:

惰性初始化的意义在于延迟分配资源,因为您不知道何时或是否需要它们。

在您的情况下,这并没有什么意义:一旦上传图像,服务器就会需要缩略图——用户希望立即看到新图像,对吗?因此,推迟创建缩略图没有积极的投资回报率。

【讨论】:

  • 同意。这是我所追求的概念性答案。
  • 确实 - 尽管有缺点,但这是我认为 Personal Site Starter 工具包正确的事情之一 - 如果您将图像和各种缩略图存储在数据库中,则生成缩略图为您最初上传/保存它。
【解决方案2】:

几个月前,我在上传图片、缩略图生成以及生成缩略图的代码应该去哪里的问题上遇到了一个非常相似的问题。我也真的觉得这段代码属于服务层(尤其是因为图像文件和缩略图的存储被抽象到接口中并通过 IOC 容器注入,我不想在我的域中注入任何依赖项层)。

最后,我通过从 UI 控制器调用服务层在上传图像时创建了所有缩略图。不过,在此之前,我确实尝试在域层中生成图像。为此,我使用了一种模式,当域层需要生成图像时,它会引发一个连接到服务层的事件。然后,服务层通过事件 args 将存储接口的实例传回给域层,以便域层可以持久保存图像。这是非常松散地基于Udi Dahan's blog 上的一些想法,我在域模型中使用事件作为利用服务层中的逻辑的一种方式。不幸的是,我现在在 Udi 的网站上找不到参考资料,但它在某处。无论如何,它从来没有真正感觉正确 - 它似乎通过另一条路线紧密耦合,这就是为什么我恢复到在图像首次通过服务层上传时创建缩略图。但是,也许在您的情况下,您可以使用来自领域层的事件的想法来调用服务层中的逻辑。我确信这个想法本身有很多价值,它只是不太适合我正在做的事情。

【讨论】:

  • 有趣。我确实考虑过将这两层连接起来的事件作为“B 计划”......但我觉得你“从来没有真正感觉正确”。它似乎也很混乱。我想第一次访问这些图像将是上传者从成功上传中获取帖子时 - 所以无论我是否在创建时产生拇指或懒惰 - 结果都是一样的。
【解决方案3】:

我假设为了显示图像,您需要图像 URI,它可以通过 IThumbnailingService 传递给您,如果需要,它将生成缩略图并返回指向生成图像的有效 URI。

【讨论】:

  • 请详细说明。我不明白 URI 对我有什么好处。我需要从 Thumbnail 属性返回的 Image 实例。我希望调用 Thumbnail 属性并从数据库中获取图像与调用 Thumbnail 属性并启动“lazy-gen”的唯一区别是在生成和持久化的同时阻塞几百毫秒第一次。
猜你喜欢
  • 2023-03-19
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多