0

我是 Flex 和 Cairngorm 的新手。在使用 ServiceLocator 时,我确实遇到了问题:错误:C0001E:只能实例化一个 ServiceLocator 实例。

我的代码是这样的:

在 Serives.mxml 中:

<cairngorm:ServiceLocator xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:cairngorm="com.adobe.cairngorm.business.*">
<mx:HTTPService id="statistServ"
    url="rooms.xml"
    showBusyCursor="true"
    method="POST"
    resultFormat="array"/>

在 Delegate.as 中,我有片段:

this.service = ServiceLocator.getInstance().getHTTPService(”statistServ”);

在 Main.xml 中,片段如下:

<business:Service id="service" />

当我加载需要 httpservice 的某个模块的第二个实例时,就会弹出这个美妙的小错误消息。

有没有办法在不切换到另一个框架的情况下解决这个问题?

最良好的祝愿,

Shuo(来自中国)

4

1 回答 1

2

您看到的错误来自 Cairngorm 对单例模式的实现。它阻止您创建 ServiceLocator 的第二个实例,因为该框架要求只有一个。加载模块的第二个实例时,您的代码也会尝试创建 ServiceLocator 的第二个实例,而它应该使用 getInstance() (或根本没有获取实例)。

通过在 Main.mxml 中声明服务标记,您已经创建了唯一的 ServiceLocator 实例,并且无法在其他任何地方声明或更新它。如果 Main.mxml 是您尝试多次实例化的模块的一部分,那么这就是您的问题所在。如果不是,我无法根据上面的有限示例判断问题出在代码中的哪个位置,但它应该在模块中的某个位置。

回复评论:

没问题。您可以通过在 ActionScript 而不是 MXML 中声明您的服务来轻松解决您的问题。通过在 MXML 中声明一个标签,您总是在创建相应的 AS 类的实例,而您却想检索单例的唯一实例。为此,请在模块 MXML 中包含以下 AS 代码:

var service:Service = Service(ServiceLocator.getInstance());

这基本上等同于您尝试使用 MXML 标记执行的操作,除了不创建新的服务实例。

但是,您仍然需要在某处实例化服务。为此,请将 Service MXML 标记放在正在加载模块的应用程序的主 MXML 中。

于 2009-05-07T02:27:26.790 回答