对于背景,我有一个松散地基于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进行转换。也许我不希望服务层完全执行这个逻辑。也许我的设计太可怕了,我根本不应该面对这个混乱。
请帮助。所有反馈都表示赞赏。
答案 0 :(得分:2)
最后,我通过从UI控制器调用服务层来创建图像上传的所有缩略图。我之前尝试在域层中生成图像。为此,我使用了一种模式,当需要生成图像的域层时,它会引发一个连接到服务层的事件。然后,服务层通过事件args将存储接口的实例传递回域层,以便域层可以保留映像。这是基于Udi Dahan's blog上关于使用域模型中的事件作为在服务层中利用逻辑的方式的{{3}}的一些想法。我现在不幸在Udi的网站上找到了参考资料,但它在某处。在任何情况下,它从来没有真正感觉到正确 - 它似乎是通过另一条路线的紧耦合,这就是为什么我恢复到在图像首次通过服务层上传时创建缩略图的原因。但是,也许在您的情况下,您可以使用域层事件的概念来调用服务层中的逻辑。我确信这个想法本身有很多价值,它只是不太符合我的目的。
答案 1 :(得分:2)
延迟初始化的目的是推迟分配资源,因为你不知道何时或是否需要它们。
在你的情况下,这没有多大意义:一旦上传图像,服务器将需要缩略图 - 用户想立即看到新图像,对吗?因此,推迟创建缩略图没有积极的投资回报率。
答案 2 :(得分:0)
我假设为了显示图像,您需要图像URI,IThumbnailingService
可以将其传递给您,如果需要,它将生成缩略图并返回指向生成图像的有效URI。 / p>