服务管理器

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.



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