ServiceFactory¶
-
class
cppmicroservices::
ServiceFactory
¶ A factory for bundle scope services.
The factory can provide service objects unique to each bundle.
When registering a service, a
ServiceFactory
object can be used instead of a service object, so that the bundle developer can create a customized service object for each bundle that is using the service.When a bundle requests the service object, the framework calls the
ServiceFactory::GetService
method to return a service object customized for the requesting bundle. The returned service object is cached by the framework for subsequent calls toBundleContext::GetService(const ServiceReference&)
until the bundle releases its use of the service.When the bundle’s use count for the service is decremented to zero (including the bundle stopping or the service being unregistered), the framework will call the
ServiceFactory::UngetService
method.ServiceFactory
objects are only used by the framework and are not made available to other bundles in the bundle environment. The framework may concurrently call aServiceFactory
.- See
- BundleContext::GetService
- See
- PrototypeServiceFactory
- Remark
- This class is thread safe.
Subclassed by cppmicroservices::PrototypeServiceFactory
Public Functions
-
virtual
~ServiceFactory
()¶
-
virtual InterfaceMapConstPtr
GetService
(const Bundle &bundle, const ServiceRegistrationBase ®istration) = 0¶ Returns a service object for a bundle.
The framework invokes this method the first time the specified
bundle
requests a service object using theBundleContext::GetService(const ServiceReferenceBase&)
method. The factory can then return a customized service object for each bundle.The framework checks that the returned service object is valid. If the returned service object is null or does not contain entries for all the classes named when the service was registered, a framework event of type
FrameworkEvent::FRAMEWORK_ERROR
is fired containing a service exception of typeServiceException::FACTORY_ERROR
and null is returned to the bundle. If this method throws an exception, a framework event of typeFrameworkEvent::FRAMEWORK_ERROR
is fired containing a service exception of typeServiceException::FACTORY_EXCEPTION
with the thrown exception as a nested exception and null is returned to the bundle. If this method is recursively called for the specified bundle, a framework event of typeFrameworkEvent::FRAMEWORK_ERROR
is fired containing a service exception of typeServiceException::FACTORY_RECURSION
and null is returned to the bundle.The framework caches the valid service object, and will return the same service object on any future call to
BundleContext::GetService
for the specified bundle. This means the framework does not allow this method to be concurrently called for the specified bundle.- Return
- A service object that must contain entries for all the interfaces named when the service was registered.
- See
- BundleContext::GetService
- See
- InterfaceMapConstPtr
- Parameters
bundle
: The bundle requesting the service.registration
: TheServiceRegistrationBase
object for the requested service.
-
virtual void
UngetService
(const Bundle &bundle, const ServiceRegistrationBase ®istration, const InterfaceMapConstPtr &service) = 0¶ Releases a service object customized for a bundle.
The Framework invokes this method when a service has been released by a bundle. If this method throws an exception, a framework event of type
FrameworkEvent::FRAMEWORK_ERROR
is fired containing a service exception of typeServiceException::FACTORY_EXCEPTION
with the thrown exception as a nested exception.- See
- InterfaceMapConstPtr
- Parameters
bundle
: The Bundle releasing the service.registration
: TheServiceRegistration
object for the service being released.service
: The service object returned by a previous call to theServiceFactory::GetService
method.