我是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的某个模块的第二个实例时弹出。

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

祝福,

来自中国的硕士

有帮助吗?

解决方案

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

通过在Main.mxml中声明您的Services标记,您已经创建了单独的ServiceLocator实例,并且无法在其他任何地方声明或新建它。如果Main.mxml是您尝试多次实例化的模块的一部分,那就是您的问题。如果没有,我无法分析代码中的问题是基于上面的有限示例,但它应该在模块中的某个位置。

回复评论:

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top