我应该如何延迟生成缩略图?

问题描述 投票:0回答:3

对于背景,我有一个松散地基于Rob Conery 的 Storefront 模型的数据层和服务层,就像 Rob 的模型一样,我的许多域对象与

LazyList<>
LazyItem<>
链接在一起以利用延迟Linq2Sql 提供的执行,因为我的
Lazy*
类型使用
IQueryable<T>
而不是 this awesome delegate approach.

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

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 进行转换。也许我根本不应该让服务层执行这个逻辑。也许我的设计太可怕了,我真的根本不应该面对这个烂摊子。我可以使用什么方法?

asp.net-mvc linq-to-sql domain-driven-design lazy-loading iqueryable
3个回答
2
投票

lazy init 的要点是推迟分配资源,因为您不知道何时或是否需要它们。

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


2
投票

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

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


0
投票

我假设为了显示图像,您需要图像 URI,它可以通过

IThumbnailingService
传递给您,如果需要,它将生成缩略图并返回指向生成图像的有效 URI。

© www.soinside.com 2019 - 2024. All rights reserved.