MVC-ish:谁负责加载数据?

时间:2009-09-05 01:24:42

标签: actionscript-3 model-view-controller domain-driven-design

我刚刚离开了一个小项目,我试图遵循一个有点域驱动的设计(好吧,我认为它是......)。我有点挣扎,因为我的一些域类开始需要加载一些东西。我不确定这是否适合它。

让我们举一个无聊的图片幻灯片。对于我的域类,我会定义让我们说一个 Image 类,也许是一个幻灯片类,其中包含一堆 Image 实例。现在,在我的应用程序的某个地方,有人需要从文件系统加载实际图像来显示它。

所以问题是:

  1. 谁负责加载实际图片? Image类,幻灯片类或域类之外的东西?我的域对象应该以不同的方式组织吗?
  2. 加载后,我在哪里存储此图片?如何将其传递给视图?
  3. 注意:在非阻塞而非多线程环境(如Flash)中,加载内容始终是异步的。

    由于

4 个答案:

答案 0 :(得分:2)

我知道你对领域驱动设计感到困惑是什么意思。

在DDD的学习过程中,我和你在同一条船上。如果我提供误导性的信息,请放轻松。

我说过这就是我如何处理这个问题:

创建一个名为 Projector 服务类。

创建另一个名为 SlidehowsRepository 存储库类。它负责与数据库通信以加载信息。因此它可以包含加载文件(或指向文件的指针)的函数,也可以包含从数据库加载其他sideshow信息的函数。但其唯一目的是从数据库中加载sideshow信息。

- 您的投影机服务类将使用幻灯片库将一些图片加载到图像类列表中。 (我假设这是你对图像类的预期用途)。不确定 Sideshow 类的目的是什么,但无论它是什么,它都可能在Projector类中使用。我将Projectors类视为需要完成的工作的协调者,以便翻阅幻灯片并向应用程序提供适当的信息(或者在MVC的情况下为控制器)。但它不会直接与数据库通信。它将使用 SlideshowsRepository 从数据库中获取信息。

因此,MVC中的控制器只需要实例化Projector并在其上调用非常高级的函数。例如start,stop,next,loadSlideshowByName ......等......投影机可以做的其他事情。一旦投影仪返回您需要的信息,可能是一个图像类列表,其中包含您要显示的图像信息,您只需将其从MVC中的控制器传递给View。而且你可能知道View应该是“愚蠢的”所以它除了知道如何显示你提供的信息之外什么都不做。但幻灯片放映的业务逻辑可能会被扭曲到投影仪服务类中。

我认为通过这种设计,您也可以使用依赖注入。因此,您的MVC控制器依赖于投影仪,投影仪依赖于 SlideshowsRepository 幻灯片图像类。或类似的东西取决于您决定如何设置依赖项。

这有意义吗?或者我完全偏离你所寻找的主题?

答案 1 :(得分:1)

我不完全确定DDD是什么,所以在阅读时请记住这一点。

在幻灯片放映的情况下,它几乎似乎是个人选择的问题。由于图像或多或少是不可变的,您可以认为图像的URL是模型,而您加载的位图数据是视图的一部分。因此,在这种情况下,您的Image类可能包含ImageView将加载的URL。

如果您觉得位图数据确实是模型的一部分,并且您需要能够在位图数据更改时刷新视图,则可以在Image类中加载bitmapdata并在完成后将其传递给视图加载。

在编写类似这样的东西时,我通常倾向于使用前面的例子。 ImageView将有一个Loader对象,在设置模型时开始加载。在加载过程中将显示加载消息,并且事件侦听器将确定何时应将加载器添加到舞台中。

希望这有帮助!

答案 2 :(得分:0)

Here is an MVCS ImageGallery example我使用Robotlegs。我在组件中加载图像。您使用的数据,xml或任何数据都会加载并存储在模型中。您当然可以加载图像字节并将其存储在模型上。这实际上取决于你计划如何使用它们。对于图像处理应用程序,我可能会将原始字节存储在模型上,并将一个副本传递给视图。

答案 3 :(得分:0)

  

谁负责加载   实际形象?

控制器。

  

加载后,我该将图像存储在哪里?

在模型中。

  

如何将其传递给视图?

在Web应用程序中,通常通过HTTP请求将模型传递给视图,但这取决于您正在使用的抽象。 Flash我知道的很少,但在Java中,例如,有一个HttpServletRequest,它有属性。这就是模型的用武之地。在PHP中,“全局”状态实际上是一个请求,所以它就是它的所在。