On 03/22/2012 01:56 PM, Noel Grandin wrote:
How do I decide whether to change the constructor to take
XComponentContext or XMultiComponentFactory?
It is always XComponentContext that you want to move around, never
XMultiComponentFactory.
In the old days, there was just XMultiServiceFactory, used for two
different things:
* A global XMultiServiceFactory (passed around), through which client
code can instantiate services it wants to use.
* Each service implementation itself has some XMultiServiceFactory (or
XSingleServiceFactory; often hidden within the implementations behind
some helper foo), through which the global XMultiServiceFactory obtains
instances of the given service. When the global XMultiServiceFactory
instantiats a service, it passes a ref to itself to that service, so
that that service in turn has a global XMultiServiceFactory where /it/
can instantiate further services from, if necessary.
With the introduction of the component context, things changed slightly:
* There is now a global XComponentContext. It contains an
XMultiComponentFactory (XComponentContext.getServiceManager) through
which client code can instantiate services it wants to use. (And
new-style service constructors hide this
getServiceManager()->createInstance(...) stuff.)
* An XMultiComponentFactory is like an XMultiServiceFactory, except it
allows to pass on the (global) XComponentContext. (And the
implementation of the global XMultiComponentFactory also still supports
the XMultiServiceFactory interface, for backwards compatibility.)
* Service implementations nowadays should have an XMultiComponentFactory
(or XSingleComponentFactory) through which the global
XComponentContext/XMultiComponentFactory can create instances of them
(as that way those instances receive the global XComponentContext for
internal use). Again, there is helper foo to do just that
(cppu::component_getFactoryHelper; see configmgr/source/services.cxx for
a clean example of how such a factory for various services and
singletons implemented within one library should look like). For
historic reasons, lots of service implementations still use the old way,
though.
As a quick fix, you can pass comphelper::getProcessComponentContext()
(#include "comphelper/processfactory.hxx") into create(), but you
unfortunately cannot even commit that, as it violates module
dependencies (comphelper depends on ucbhelper, so ucbhelper cannot
depend on comphelper). The right fix is to change the
ResultSetImplHelper constructor and adapt all its uses accordingly.
For code not below comphelper that only has a global
XMultiServiceFactory at hand, but rather needs an XComponentContext
(e.g., to pass it into a new-style service constructor),
comphelper::getComponentContext (comphelper/processfactory.hxx) can be
used to convert the former into the latter. (But the best fix, of
course, is to change all places that currently have a reference to the
global XMultiServiceFactory, to instead have a reference to the global
XComponentContext.)
Stephan
Context
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.