我该如何懒惰生成缩略图?

时间:2009-05-13 07:58:24

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

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

所以我有一个像这样的对象图(基本上,每个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,将其持久保存到DB,然后返回Image实例,这是较小的照片。我有所有代码从全尺寸图像创建缩略图,所以这不是问题。

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

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

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

请帮助。所有反馈都表示赞赏。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

延迟初始化的目的是推迟分配资源,因为你不知道何时或是否需要它们。

在你的情况下,这没有多大意义:一旦上传图像,服务器将需要缩略图 - 用户想立即看到新图像,对吗?因此,推迟创建缩略图没有积极的投资回报率。

答案 2 :(得分:0)

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