0

作为背景,我有一个数据层和服务层,松散地基于Rob Conery 的店面模型,就像 Rob 的一样,我的许多域对象都用LazyList<>'s 和LazyItem<>'s 链接,以利用 Linq2Sql 提供的延迟执行,因为我的Lazy*类型利用IQueryable<T>而不是这种令人敬畏的委托方法

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

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

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

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

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

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

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

请帮忙。感谢所有反馈。

4

3 回答 3

2

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

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

于 2009-05-13T08:25:06.657 回答
2

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

在您的情况下,这没有任何意义:一旦上传图像,服务器将需要缩略图 - 用户希望立即看到新图像,对吗?因此,推迟创建缩略图没有积极的 ROI。

于 2009-05-13T08:33:10.107 回答
0

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

于 2009-05-13T08:02:29.843 回答