Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Service Manager"

From Apache OpenOffice Wiki
Jump to: navigation, search
m
m
 
Line 6: Line 6:
 
|NextPage=Zh/Documentation/DevGuide/ProUNO/Component Context
 
|NextPage=Zh/Documentation/DevGuide/ProUNO/Component Context
 
}}
 
}}
[[en:Documentation/DevGuide/ProUNO/Service Manager]]
+
{{Documentation/DevGuideLanguages|Documentation/DevGuide/ProUNO/{{SUBPAGENAME}}}}
 
{{DISPLAYTITLE:服务管理器}}
 
{{DISPLAYTITLE:服务管理器}}
  

Latest revision as of 02:05, 14 May 2009



com.sun.star.lang.ServiceManager 是每个 UNO 应用程序中的主要工厂。它按服务名称实例化服务,以枚举某项具体服务的所有实现,并在运行时添加或删除某项具体服务的工厂。实例化时,服务管理器被传送到每个 UNO 组件。


XMultiServiceFactory 接口

服务管理器的主要接口是 com.sun.star.lang.XMultiServiceFactory 接口。它提供三个方法:createInstance()createInstanceWithArguments()getAvailableServiceNames()

  interface XMultiServiceFactory: com::sun::star::uno::XInterface
  { 
      com::sun::star::uno::XInterface createInstance( [in] string aServiceSpecifier ) 
          raises( com::sun::star::uno::Exception ); 
 
      com::sun::star::uno::XInterface createInstanceWithArguments(
              [in] string ServiceSpecifier, 
              [in] sequence<any> Arguments ) 
          raises( com::sun::star::uno::Exception ); 
 
      sequence<string> getAvailableServiceNames();
  };
  • createInstance() 返回一个默认构造的服务实例。返回的服务保证至少支持所有接口,这些接口是通过请求的服务名称来指定的。现在,可以从返回的 XInterface 引用中查询服务说明中指定的接口。
使用服务名称时,调用程序不会对实例化哪个具体实现产生任何影响。如果某项服务存在多个实现,服务管理器就可以自由决定采用哪个实现。这一般不会对调用程序产生影响,因为每个实现都确实履行服务合同。性能或其他细节可能会有所不同。因此,也可以传送实现名称 ,而不是服务名称;但是,不建议这样做,因为实现名称可能会更改。
如果服务管理器没有为某个请求提供实现,将会返回一个空引用,因此必须进行检查。实例化时,可能会抛出所有 UNO 异常。有些可能会在要实例化的服务的规范中说明,例如,由于具体实现的配置不正确。另一个原因可能是缺少某个具体桥,例如,Java-C++ 桥,以防从 C++ 代码实例化 Java 组件。
  • createInstanceWithArguments() 使用附加参数实例化服务。一项服务表示在通过支持 com.sun.star.lang.XInitialization 接口进行实例化时需要参数。服务定义应该说明序列中每个元素的意义。可能有些服务必须使用参数来实例化。
  • getAvailableServiceNames() 返回服务管理器确实支持的所有服务名称。


XContentEnumerationAccess 接口

com.sun.star.container.XContentEnumerationAccess 接口允许创建具体服务名称的所有实现的枚举。

  interface XContentEnumerationAccess: com::sun::star::uno::XInterface
  { 
      com::sun::star::container::XEnumeration createContentEnumeration( [in] string aServiceName ); 
 
      sequence<string> getAvailableServiceNames(); 
 
  };

createContentEnumeration() 方法返回一个 com.sun.star.container.XEnumeration 接口。请 注意,如果枚举为空,此方法可能会返回空引用。 方法返回一个 com.sun.star.container.XEnumeration 接口。请注意,如果枚举为空,此方法可能会返回空引用。

  interface XEnumeration: com::sun::star::uno::XInterface
  { 
      boolean hasMoreElements(); 
 
      any nextElement() 
          raises( com::sun::star::container::NoSuchElementException, 
                  com::sun::star::lang::WrappedTargetException ); 
 
  };

在上面的示例中,方法 Xenumeration.nextElement() 返回的 any 中,包含一个与此特定服务的每个实现对应的 com.sun.star.lang.XSingleServiceFactory 接口。例如,您可以遍历某项具体服务的所有实现,并检查附加的已实现服务的每个实现。XSingleServiceFactory 接口就提供这样的方法。利用此方法,您可以实例化一个服务丰富的功能实现。


XSet 接口

com.sun.star.container.XSet 接口允许在运行时将 com.sun.star.lang.XSingleServiceFactorycom.sun.star.lang.XSingleComponentFactory 实现插入到服务管理器或从中删除而不保存这些更改。办公软件应用程序终止时,所有更改将失效。对象还必须支持 com.sun.star.lang.XServiceInfo 接口,用于提供有关组件实现的实现名称和所支持服务的信息。


在开发阶段可能会对此功能可能特别感兴趣。例如,您可以连接到正在运行的办公软件,在服务管理器中插入新的工厂,以及在不需要提前注册的情况下直接实例化新服务。


编写 UNO 组件 - 组件的部署选项 - 特殊服务管理器配置 一节中给出了一个示例,说明如何将工厂插入到服务管理器中。


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages