我刚接触Flex我使用的是ServiceLocator,我确实遇到了这样的问题: Error: 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
发布于 2009-05-07 02:27:27
您所看到的错误来自于凯恩戈姆对Singleton模式的实现。它阻止您创建ServiceLocator的第二个实例,因为框架要求只有一个实例。当加载模块的第二个实例时,您的代码还会尝试创建ServiceLocator的第二个实例,而此时它应该使用getInstance() (或者根本不获取实例)。
通过在Main.mxml中声明您的服务标记,您已经创建了您的ServiceLocator的唯一实例,并且不能在其他任何地方声明或更新它。如果Main.mxml是您多次尝试实例化的模块的一部分,那么这就是问题所在。如果不是,我不能根据上面有限的示例来判断问题在您的代码中的哪里,但它应该在模块中的某个地方。
回复评论:
没问题。你可以通过用ActionScript而不是MXML来声明你的服务来解决你的问题。通过在MXML中声明标记,您总是在创建相应AS类的实例,而您却希望检索单例的唯一实例。为此,请将以下代码作为代码包含在模块MXML中:
var service:Service = Service(ServiceLocator.getInstance());除了不创建新的Service实例之外,这基本上等同于您尝试使用MXML标记所做的事情。
但是,您仍然需要在某个位置实例化该服务。为此,将Service MXML标记放在加载模块的应用程序的主MXML中。
https://stackoverflow.com/questions/832445
复制相似问题