DOC: update technical (doxygen) documentation to reflect the integration with lib::Depend
This commit is contained in:
parent
31a2e5879d
commit
db7172df29
5 changed files with 195 additions and 109 deletions
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
INSTANCEHANDLE.hpp - automatically handling interface lifecycle
|
||||
INSTANCEHANDLE.hpp - automatically handling interface lifecycle
|
||||
|
||||
Copyright (C) Lumiera.org
|
||||
2008, Hermann Vosseler <Ichthyostega@web.de>
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
** @see gui::GuiFacade usage example
|
||||
** @see interface.h
|
||||
** @see interfaceproxy.hpp (more explanations)
|
||||
** @see interfaceproxy.cpp (Implementation of the proxies)
|
||||
** @see session-command-interface-proxy.cpp (Proxy implementation example)
|
||||
**
|
||||
*/
|
||||
|
||||
|
|
@ -66,17 +66,17 @@ namespace lumiera {
|
|||
namespace { // implementation details
|
||||
|
||||
void
|
||||
throwIfError()
|
||||
throwIfError()
|
||||
{
|
||||
if (lumiera_error_peek())
|
||||
throw lumiera::error::Config("failed to open interface or plugin.",lumiera_error());
|
||||
}
|
||||
|
||||
|
||||
/** takes a (single) instance definitions, as typically created
|
||||
* when defining interfaces for external use, and registers it
|
||||
* with the InterfaceSystem. Then uses the data found in the
|
||||
* \em given instance descriptor to open an instance handle.
|
||||
* @throws error::Config when the registration process fails
|
||||
* @throws error::Config when the registration process fails
|
||||
*/
|
||||
LumieraInterface
|
||||
register_and_open (LumieraInterface descriptor)
|
||||
|
|
@ -97,22 +97,33 @@ namespace lumiera {
|
|||
verify_validity (LumieraInterface ifa)
|
||||
{
|
||||
REQUIRE (ifa);
|
||||
return (ifa == lumiera_interfaceregistry_interface_find (ifa->interface,
|
||||
ifa->version,
|
||||
return (ifa == lumiera_interfaceregistry_interface_find (ifa->interface,
|
||||
ifa->version,
|
||||
ifa->name));
|
||||
}
|
||||
|
||||
} // (End) impl details
|
||||
|
||||
} // (End) impl details
|
||||
|
||||
|
||||
|
||||
|
||||
namespace facade {
|
||||
|
||||
|
||||
/**
|
||||
* to be specialised and implemented for each
|
||||
* individual interface and facade interface.
|
||||
* The actual proxy implements the facade interface
|
||||
* and reroutes each call to the corresponding function
|
||||
* on the CL-Interface for the Lumiera interface system.
|
||||
*/
|
||||
template<class IHA>
|
||||
class Proxy;
|
||||
|
||||
/** The ServiceHandle automatically creates and manages the Proxy instance */
|
||||
template<class I, class FA>
|
||||
using ServiceHandle = typename lib::DependInject<FA>::template ServiceInstance<Proxy<InstanceHandle<I,FA>>>;
|
||||
|
||||
|
||||
/**
|
||||
* @internal Helper/Adapter for establishing a link
|
||||
* between an InstanceHandle and a facade interface,
|
||||
|
|
@ -179,7 +190,7 @@ namespace lumiera {
|
|||
>
|
||||
class InstanceHandle
|
||||
: util::NonCopyable
|
||||
{
|
||||
{
|
||||
LumieraInterface desc_;
|
||||
I* instance_;
|
||||
facade::Link<I,FA> facadeLink_;
|
||||
|
|
@ -194,14 +205,14 @@ namespace lumiera {
|
|||
*/
|
||||
InstanceHandle (string const& iName, uint version, size_t minminor, string const& impName)
|
||||
: desc_(0)
|
||||
, instance_(reinterpret_cast<I*>
|
||||
, instance_(reinterpret_cast<I*>
|
||||
(lumiera_interface_open (iName.c_str(), version, minminor, impName.c_str())))
|
||||
, facadeLink_(*this)
|
||||
{
|
||||
{
|
||||
throwIfError();
|
||||
}
|
||||
|
||||
/** Set up an InstanceHandle managing the
|
||||
/** Set up an InstanceHandle managing the
|
||||
* registration and deregistration of interface(s).
|
||||
* Should be placed at the service providing side.
|
||||
* @param a (single) interface descriptor, which can be created with
|
||||
|
|
@ -211,7 +222,7 @@ namespace lumiera {
|
|||
: desc_(descriptor)
|
||||
, instance_(reinterpret_cast<I*> (register_and_open (desc_)))
|
||||
, facadeLink_(*this)
|
||||
{
|
||||
{
|
||||
throwIfError();
|
||||
}
|
||||
|
||||
|
|
@ -224,24 +235,41 @@ namespace lumiera {
|
|||
|
||||
|
||||
|
||||
/** act as smart pointer providing access through the facade.
|
||||
* @note we don't provide operator* */
|
||||
FA * operator-> () const { return facadeLink_.operator ->(); }
|
||||
/** act as smart pointer to allow access through the facade.
|
||||
* @note we don't provide `operator*`
|
||||
*/
|
||||
FA*
|
||||
operator-> () const
|
||||
{
|
||||
return facadeLink_.operator ->();
|
||||
}
|
||||
|
||||
/** directly access the instance via the CL interface */
|
||||
I& get () const { ENSURE(instance_); return *instance_; }
|
||||
I&
|
||||
get () const
|
||||
{
|
||||
ENSURE(instance_);
|
||||
return *instance_;
|
||||
}
|
||||
|
||||
|
||||
|
||||
explicit operator bool() const { return isValid(); }
|
||||
bool operator! () const { return not isValid();}
|
||||
explicit
|
||||
operator bool() const
|
||||
{
|
||||
return isValid();
|
||||
}
|
||||
bool
|
||||
operator!() const
|
||||
{
|
||||
return not isValid();
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
bool
|
||||
bool
|
||||
isValid() const
|
||||
{
|
||||
return instance_
|
||||
{
|
||||
return instance_
|
||||
&& verify_validity (&instance_->interface_header_);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -137,6 +137,6 @@ LUMIERA_INTERFACE_DECLARE (lumieraorg_GuiNotification, 0,
|
|||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
}// extern "C"
|
||||
#endif
|
||||
#endif /*GUI_GUI_NOTIFICATION_H*/
|
||||
|
|
|
|||
|
|
@ -21,71 +21,102 @@
|
|||
*/
|
||||
|
||||
/** @file interfaceproxy.hpp
|
||||
** Facade Interfaces Lifecycle. Communication between the Layers within Lumiera
|
||||
** usually is routed through *Layer Separation Interfaces*. These are comprised
|
||||
** of a Facade interface and a equivalent rendering as C Language interface defined
|
||||
** with the help of the Interface/Plugin system. But in order to be able to actually
|
||||
** access a service via this Facade, you need an instance of the interface.
|
||||
** Implementation of C++ binding proxies on top of the (plain-C based) interface system.
|
||||
** This is an implementation facility within the application core, which allows to embody
|
||||
** just an ["interface instance handle"](\ref instancehandle.hpp) into the implementation
|
||||
** os some service, in order to get RAII-style registration of interfaces and loading of
|
||||
** plug-ins.
|
||||
**
|
||||
** lumiera::facade::Proxy and InstanceHandle together are used to create such an concrete
|
||||
** instance of the Facade interface. It is implemented such as to route each call
|
||||
** through the corresponding C Language function defined in the Interface/Plugin system.
|
||||
** Typically there is another subclass of the Facade interfaces sitting "on the other side"
|
||||
** of the interface barrier and actually implementing the functionality. The template
|
||||
** facade::Accessor can be thought of as a factory creating such a proxy instance of the
|
||||
** facade interface for the client code to use. Typically, an instance of the _factory_
|
||||
** is embedded (as a static functor member object) right within the otherwise abstract
|
||||
** facade interface, this way allowing the client code to write e.g. `XYZInterface::facade()`
|
||||
** A *crucial requirement* for this approach to work is that any relevant interface
|
||||
** to be bound and exposed as C++ object needs to set up a concrete specialisation of
|
||||
** lumiera::facade::Proxy to drive instantiation of the actual binding proxy.
|
||||
** The result of this setup is that clients can just invoke `SomeInterface::facade()`
|
||||
** and thus call through proper C++ bindings with type safety and automatic
|
||||
** lifecycle management.
|
||||
**
|
||||
** # Interface, Plug-in, Facade interface, Instance Handle and Proxy
|
||||
**
|
||||
** These are all terms related to the Interface- and Plug-in system for Lumiera.
|
||||
** Communication between the Layers within the architecture is usually routed through
|
||||
** *Layer Separation Interfaces*. Here we have to distinguish two different flavours
|
||||
** of an "interface"
|
||||
** - A Façade interface is written in C++ and is what you's usually
|
||||
** denote with the term "interface": it defines a contract in terms of
|
||||
** some abstract entities, without exposing implementation details.
|
||||
** Ideally, the interface holds all you need to use a given service.
|
||||
** - A C Language interface defined with the help of the Interface/Plugin system.
|
||||
** It is a collection of functions and supports only the primitive types of the
|
||||
** bare C Language. Objects need to be emulated by pointers to a struct type,
|
||||
** and functors must be represented as static function pointers. In many cases
|
||||
** you need to fall back to untyped `void*` unfortunately.
|
||||
**
|
||||
** @todo 2018 as it stands (since 2008), the Interface/Plug-in system fulfils the basic task
|
||||
** it was created for, but is rather cumbersome to use in practice. We should investigate
|
||||
** to use SWIG or something similar to generate the bindings and the low-level interfaces.
|
||||
**
|
||||
** The Interface/Plug-in system offers two basic usage scenarios
|
||||
** - a CL-Interface can be published (from the service provider side).
|
||||
** From that point on, clients can "open" that interface and talk to it.
|
||||
** - a _client_ can use the CL-Interface of a Plug-in to _load_ a plug-in instance.
|
||||
** From that point on, clients can talk through a interface handle to the plug-in.
|
||||
**
|
||||
** An Attempt was made to simplify and unify this process with the help of an InstanceHandle.
|
||||
** This is an RAII-style handle object, which automates the registration and instance management.
|
||||
**
|
||||
** But in order to be able to actually access some service via a high-level façade interface,
|
||||
** we still need a way to get a callable instance of the façade interface. This is where the
|
||||
** proxy implementation comes into play. The binding proxy implements the façade and maps each
|
||||
** high-level call into an invocation of the corresponding low-level function on the CL-interface.
|
||||
**
|
||||
** Whenever InstanceHandle was created with a second template parameter defining a façade interface,
|
||||
** it automatically attempts to instantiate a lumiera::facade::Proxy templated to the actual type
|
||||
** of the InstanceHandle. This proxy instance is then exposed via `lib::Depend<FacadeInterface>`
|
||||
** This way, any call will be routed through the corresponding C Language function defined within
|
||||
** the Interface/Plugin system. Moreover, there will be another subclass of the Facade interface
|
||||
** sitting "on the other side" of the interface barrier to _actually implement_ the functionality.
|
||||
**
|
||||
** As a convention, each façade interface should hold a static accessor member named "facade" of
|
||||
** type `lib::Depend<FacadeInterface>`, so client code can write e.g. `XYZInterface::facade()`
|
||||
** to yield a reference to a proxy object implementing `XYZInterface`.
|
||||
**
|
||||
**
|
||||
** # Interface Lifecycle
|
||||
**
|
||||
** Instances of an Interface are either directly provided by some facility within the core,
|
||||
** or they are loaded from a shared module (plugin). In either case this means the interface
|
||||
** isn't accessible all the time, rather it comes up at a defined point in the application
|
||||
** lifecycle and similarly will be shut down deliberately at some point. Beyond this time
|
||||
** window of availability, any access through the proxy factory throws an lumiera::error::State.
|
||||
** window of availability, any access through the proxy factory throws an lumiera::error::Fatal.
|
||||
** Any sort of dependency management is outside the scope of the InstanceHandle (for the core
|
||||
** services, it is handled by the dependency of subsystems, while the plugin loader cares
|
||||
** for dependency issues regarding loadable modules, thereby building on the deployment
|
||||
** descriptors.)
|
||||
**
|
||||
** For the Layer separation interfaces, the process of loading and opening is abstracted as
|
||||
** an InstanceHandle object. When creating such an InstanceHandle using the appropriate
|
||||
** template and ctor parameters, in addition to the registration with the Interface/Plugin
|
||||
** system, the corresponding facade::Proxy factory is addressed and the interface instance
|
||||
** is "opened" by creating the appropriate proxy object instance. Similarly, when the
|
||||
** InstanceHandle object goes out of scope, prior to detaching from the Interface/Proxy
|
||||
** system, the corresponding lumiera::facade::Accessor frontend is "closed", which
|
||||
** additionally means destroying the proxy object instance and switching any
|
||||
** further access to throwing and exception.
|
||||
** an InstanceHandle object. A service exposing an interface defines an InstanceHandle
|
||||
** member using the appropriate template and ctor parameters; this causes registration with
|
||||
** the Interface/Plugin and instantiates the corresponding facade::Proxy, which is then
|
||||
** exposed through the lib::Depend front-end. Similarly, when the service implementation
|
||||
** object is destroyed, the InstanceHandle goes out of scope, thereby detaching from the
|
||||
** Interface/Proxy and deregistering and destroying the proxy object. Any further
|
||||
** access beyond that point will raise an exception.
|
||||
**
|
||||
** While client code just includes the interface header (including interfaceproxy.hpp
|
||||
** in turn), there needs to be an actual implementation of each proxy object located in
|
||||
** some translation unit. The usual place is interfaceproxy.cpp, which gets linked into
|
||||
** `liblumieracommon.so` and contains actual specialisations and literal forwarding
|
||||
** code _for each individual facade._
|
||||
** @todo
|
||||
** Implementation of C++ binding proxies on top of the (plain-C based)
|
||||
** interface system. This is an implementation facility within the application core,
|
||||
** which allows to embody just an ["interface instance handle"](\ref instancehandle.hpp),
|
||||
** in order to get RAII-style registration of interfaces and loading of plug-ins.
|
||||
** # Usage
|
||||
**
|
||||
** A *crucial requirement* for this approach to work is, that any relevant interface
|
||||
** to be bound and exposed as C++ object needs to set up a concrete specialisation of
|
||||
** lumiera::facade::Proxy to drive instantiation of the actual binding proxy.
|
||||
** The relevant specialisations _need to be included explicitly_ into this
|
||||
** compilation unit!
|
||||
** While client code just includes the interface header (including lib/depend.hpp),
|
||||
** there needs to be an actual implementation of each proxy object located in some translation
|
||||
** unit, linked into the application core or `liblumieracommon.so`. This translation unit
|
||||
** needs to specialise lumiera::facade::Proxy and then create an instance of that template.
|
||||
** And, most importantly, such translation units (and _only such translation units_) must
|
||||
** include this header `interfaceproxy.hpp` -- because it defines the concrete ctor
|
||||
** and dtor of the facade::Link template and thus creates the missing "link" between
|
||||
** the InstanceHandle and the actual proxy instantiation.
|
||||
**
|
||||
** The result of this setup is that clients can just invoke `SomeInterface::facade()`
|
||||
** and thus call through proper C++ bindings with type safety and automatic
|
||||
** lifecycle management.
|
||||
**
|
||||
** @see interface.h
|
||||
** @see plugin.h
|
||||
** @see lumiera::Subsys
|
||||
** @see guinotification.h usage example (facade interface)
|
||||
** @see guinotification-facade.cpp corresponding implementation within the GUI
|
||||
** @see instancehandle.hpp
|
||||
** @see gui-notification-facade.h usage example (facade interface)
|
||||
** @see notification-service.hpp
|
||||
** @see notification-service.cpp (service implementation)
|
||||
** @see notification-interface-proxy.cpp
|
||||
*/
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -133,6 +133,6 @@ LUMIERA_INTERFACE_DECLARE (lumieraorg_SessionCommand, 0,
|
|||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
}// extern "C"
|
||||
#endif
|
||||
#endif /*PROC_CONTROL_SESSION_COMMAND_H*/
|
||||
|
|
|
|||
|
|
@ -28028,7 +28028,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521790709017" ID="ID_1263887689" MODIFIED="1521947771608" TEXT="Doxygen">
|
||||
<node COLOR="#338800" CREATED="1521790709017" FOLDED="true" ID="ID_1263887689" MODIFIED="1522729534009" TEXT="Doxygen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1521790767697" ID="ID_1445751091" MODIFIED="1521936696493" TEXT="Grundsätzliches zu Singleton und Dependency-Injection (aktualisieren)">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -28059,7 +28059,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521791026749" ID="ID_1199387367" MODIFIED="1522025343672" TEXT="Doku-Subsysteme">
|
||||
<node COLOR="#338800" CREATED="1521791026749" FOLDED="true" ID="ID_1199387367" MODIFIED="1522729536992" TEXT="Doku-Subsysteme">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1521791034972" ID="ID_1629095174" MODIFIED="1521962998443" TEXT="überlegen, wo das Architektur-Thema dargestellt werden sollte">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -28089,8 +28089,8 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1520722160591" ID="ID_135546699" MODIFIED="1522421617782" TEXT="Unit-Test">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1520722160591" FOLDED="true" ID="ID_135546699" MODIFIED="1522729521383" TEXT="Unit-Test">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1521419576303" ID="ID_726128967" MODIFIED="1522042418343" TEXT="alte Tests portieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1521418937870" ID="ID_906296527" MODIFIED="1522033081893" TEXT="Singleton_test">
|
||||
|
|
@ -28144,7 +28144,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522033106576" ID="ID_278956866" MODIFIED="1522451856604" TEXT="weitere Tests...">
|
||||
<node COLOR="#338800" CREATED="1522033106576" FOLDED="true" ID="ID_278956866" MODIFIED="1522729509491" TEXT="weitere Tests...">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -28155,7 +28155,7 @@
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#15b89e" DESTINATION="ID_278956866" ENDARROW="Default" ENDINCLINATION="32;436;" ID="Arrow_ID_1985884795" SOURCE="ID_513111416" STARTARROW="None" STARTINCLINATION="223;-69;"/>
|
||||
<linktarget COLOR="#15b89e" DESTINATION="ID_278956866" ENDARROW="Default" ENDINCLINATION="-6;80;" ID="Arrow_ID_1985884795" SOURCE="ID_513111416" STARTARROW="None" STARTINCLINATION="-88;0;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522033940685" ID="ID_447878554" MODIFIED="1522451818368" TEXT="media-access-mock-test.cpp">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -28199,7 +28199,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1521160765588" ID="ID_1857896991" MODIFIED="1522451910586" TEXT="Konfig-Aufrufe anpassen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522033578207" HGAP="18" ID="ID_252429770" MODIFIED="1522389026807" TEXT="Name für Freunschaft+" VSHIFT="-20">
|
||||
<node COLOR="#338800" CREATED="1522033578207" FOLDED="true" HGAP="18" ID="ID_252429770" MODIFIED="1522729499183" TEXT="Name für Freunschaft+" VSHIFT="-20">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1522033614743" ID="ID_1110690522" MODIFIED="1522033614743" TEXT="friend class lib::InstanceHolder<TargetObj>;">
|
||||
<node CREATED="1522033621114" ID="ID_1807735289" MODIFIED="1522033629872" TEXT="nicht so sexy">
|
||||
|
|
@ -28251,7 +28251,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522033193572" ID="ID_508353720" MODIFIED="1522446432407" TEXT="DependencyFactory">
|
||||
<node COLOR="#338800" CREATED="1522033193572" FOLDED="true" ID="ID_508353720" MODIFIED="1522729485800" TEXT="DependencyFactory">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522033199726" ID="ID_314595550" MODIFIED="1522445880917" TEXT="engine-config.h">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -28290,8 +28290,8 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522034066988" ID="ID_513111416" MODIFIED="1522451868492" TEXT="alle Mock-Tests">
|
||||
<arrowlink COLOR="#15b89e" DESTINATION="ID_278956866" ENDARROW="Default" ENDINCLINATION="32;436;" ID="Arrow_ID_1985884795" STARTARROW="None" STARTINCLINATION="223;-69;"/>
|
||||
<node COLOR="#338800" CREATED="1522034066988" ID="ID_513111416" MODIFIED="1522729509491" TEXT="alle Mock-Tests">
|
||||
<arrowlink COLOR="#15b89e" DESTINATION="ID_278956866" ENDARROW="Default" ENDINCLINATION="-6;80;" ID="Arrow_ID_1985884795" STARTARROW="None" STARTINCLINATION="-88;0;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -28340,7 +28340,7 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522635350488" ID="ID_1673980887" MODIFIED="1522635365465" TEXT="InterfaceProxy auch umstellen?">
|
||||
<node COLOR="#338800" CREATED="1522635350488" ID="ID_1673980887" MODIFIED="1522729286917" TEXT="InterfaceProxy auch umstellen?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1522635366958" ID="ID_70940233" MODIFIED="1522639464220" TEXT="wäre jetzt ebenfalls denkbar">
|
||||
<icon BUILTIN="yes"/>
|
||||
|
|
@ -28475,8 +28475,8 @@
|
|||
<node CREATED="1522641344691" ID="ID_1154911224" MODIFIED="1522641358813" TEXT="gegenwärtig: bekommt das InstanceHandle"/>
|
||||
<node CREATED="1522641378263" ID="ID_1762905192" MODIFIED="1522641389641" TEXT="könnte aber direkt eine Interface-Ref sein"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522641405299" ID="ID_676190433" MODIFIED="1522641417642" TEXT="Proxy">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522641405299" ID="ID_676190433" MODIFIED="1522729429778" TEXT="Proxy">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1522641413586" ID="ID_1187300065" MODIFIED="1522649896016" TEXT="Anforderungen">
|
||||
<linktarget COLOR="#86d29d" DESTINATION="ID_1187300065" ENDARROW="Default" ENDINCLINATION="-35;65;" ID="Arrow_ID_1735914452" SOURCE="ID_1212106242" STARTARROW="None" STARTINCLINATION="-135;-67;"/>
|
||||
<node CREATED="1522641419769" ID="ID_1008132394" MODIFIED="1522641450457" TEXT="erbt vom Business-Interface"/>
|
||||
|
|
@ -28485,7 +28485,7 @@
|
|||
<node CREATED="1522643863687" ID="ID_1695236696" MODIFIED="1522643867842" TEXT="nicht kopierbar"/>
|
||||
<node CREATED="1522641463059" ID="ID_487803821" MODIFIED="1522641471349" TEXT="lebt nur so lange das Interface offen ist"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522649799320" ID="ID_1473698958" MODIFIED="1522649810312" TEXT="Ort der Definition">
|
||||
<node COLOR="#0e0099" CREATED="1522649799320" ID="ID_1473698958" MODIFIED="1522729333546" TEXT="Ort der Definition">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1522696074226" ID="ID_1811816913" MODIFIED="1522696081693" TEXT="Güterabwägung notwendig">
|
||||
<node CREATED="1522696114852" ID="ID_550024261" MODIFIED="1522696125095" TEXT="Entkoppelung Serivce / Interface"/>
|
||||
|
|
@ -28513,7 +28513,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522649812255" ID="ID_624985973" MODIFIED="1522697373660">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#0e0099" CREATED="1522649812255" ID="ID_624985973" MODIFIED="1522729342790" STYLE="fork">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -28527,23 +28527,43 @@
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1522697375430" ID="ID_712460375" MODIFIED="1522697380058" TEXT="Instantiierung">
|
||||
<node COLOR="#338800" CREATED="1522697381141" ID="ID_855121513" MODIFIED="1522697467594" TEXT="gesteuert nur durch Lebensdauer des InstanceHandle">
|
||||
<node CREATED="1522697375430" ID="ID_712460375" MODIFIED="1522729342788" TEXT="Instantiierung">
|
||||
<node COLOR="#338800" CREATED="1522697381141" ID="ID_855121513" MODIFIED="1522729342788" TEXT="gesteuert nur durch Lebensdauer des InstanceHandle">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522697396899" ID="ID_1172830820" MODIFIED="1522697469042" TEXT="Code der Proxy-Instantiierung in separater TU">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1522697396899" ID="ID_1172830820" MODIFIED="1522729342788" TEXT="Code der Proxy-Instantiierung in separater TU">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1522697475153" ID="ID_520808733" MODIFIED="1522697478164" TEXT="Definition">
|
||||
<node CREATED="1522697495790" ID="ID_1870975704" MODIFIED="1522697630073" TEXT="von Hand geschrieben">
|
||||
<node CREATED="1522697475153" ID="ID_520808733" MODIFIED="1522729342788" TEXT="Definition">
|
||||
<node CREATED="1522697495790" ID="ID_1870975704" MODIFIED="1522729342788" TEXT="von Hand geschrieben">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522697613893" ID="ID_1829346202" MODIFIED="1522697626900" TEXT="Idealerweise lediglich eigene TU">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#990000" CREATED="1522697613893" ID="ID_1829346202" MODIFIED="1522729342788" TEXT="Idealerweise lediglich eigene TU">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1522697501541" ID="ID_793991584" MODIFIED="1522697634674" TEXT="Forwading-Implementation des Business-Interface">
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1522729001386" ID="ID_242747417" MODIFIED="1522729342788" TEXT="ist mir bisher nicht gelungen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...wir müssen immer, für jeden Proxy
|
||||
</p>
|
||||
<p>
|
||||
explizit eine Template-Instaniierung triggern, und zwar für
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink COLOR="#a02659" DESTINATION="ID_1547993807" ENDARROW="Default" ENDINCLINATION="231;-29;" ID="Arrow_ID_1421481593" STARTARROW="None" STARTINCLINATION="544;-14;"/>
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
</node>
|
||||
<node CREATED="1522697501541" ID="ID_793991584" MODIFIED="1522729342788" TEXT="Forwading-Implementation des Business-Interface">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -28562,13 +28582,15 @@
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1522697743604" ID="ID_829814208" MODIFIED="1522697751286" TEXT="mögliche Lösungen">
|
||||
<node CREATED="1522697764121" ID="ID_809124789" MODIFIED="1522697772891" TEXT="PImpl">
|
||||
<node CREATED="1522697764121" FOLDED="true" ID="ID_809124789" MODIFIED="1522729411578" TEXT="PImpl">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1522698166313" ID="ID_904988310" MODIFIED="1522698184466" TEXT="facade::Link hält einen smart-Ptr"/>
|
||||
<node CREATED="1522698185030" ID="ID_53125514" MODIFIED="1522698208087" TEXT="auf die eigentliche DependInject::ServiceInstance"/>
|
||||
<node CREATED="1522698222201" ID="ID_1341541114" MODIFIED="1522698292643" TEXT="facade::Link muß Methoden (ctor/dtor und operator) separat definieren"/>
|
||||
<node CREATED="1522698295719" ID="ID_381014397" MODIFIED="1522698339173" TEXT="das ist effektiv die Lösung "separat definieren" + separate Storage"/>
|
||||
</node>
|
||||
<node CREATED="1522697803923" ID="ID_238110365" MODIFIED="1522697807907" TEXT="freie Funktionen">
|
||||
<node CREATED="1522697803923" FOLDED="true" ID="ID_238110365" MODIFIED="1522729409819" TEXT="freie Funktionen">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1522698092963" ID="ID_433421738" MODIFIED="1522698105987" TEXT="ist die bisher bestehende Lösung">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
|
|
@ -28587,13 +28609,17 @@
|
|||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1522698124263" ID="ID_475034985" MODIFIED="1522698140464" TEXT="das ist effektiv ein PImpl, das aber auch noch gemanaged werden muß"/>
|
||||
<node CREATED="1522729383029" ID="ID_212849140" MODIFIED="1522729398784" TEXT="Vorteil: erzeugen "nebenbei" die Template-Instantiierung">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1522697773903" ID="ID_116063224" MODIFIED="1522697803239" TEXT="Methoden separat definieren">
|
||||
<node CREATED="1522698343480" ID="ID_1548420276" MODIFIED="1522698385583" TEXT="dafür sorgen, daß die Definitionen nur in der Proxy-Instantiierung (TU) sichtbar sind"/>
|
||||
<node CREATED="1522698386810" ID="ID_1773412414" MODIFIED="1522698405108" TEXT="diese Definitionen müssen externe Linkage bekommen (d.h. nicht inline)"/>
|
||||
<node CREATED="1522698437036" ID="ID_1400832405" MODIFIED="1522698754819" TEXT="Erzeugung ist automatisch, sofern dort das InstanceHandle-Template instantiiert wird"/>
|
||||
<node CREATED="1522698892532" ID="ID_584280618" MODIFIED="1522698944569" TEXT="Fazit: in einer TU muß (nur) eine explizite Template-Instantiierung erfolgen"/>
|
||||
<node CREATED="1522699050727" ID="ID_1923832821" MODIFIED="1522699053402" TEXT="wie auch immer">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522699050727" ID="ID_1923832821" MODIFIED="1522729422771" TEXT="wie auch immer">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node CREATED="1522699055062" ID="ID_1759934312" MODIFIED="1522699078711" TEXT="Spezialisierung Proxy<IHA> + Template Instanz dieser">
|
||||
<node CREATED="1522699225239" ID="ID_894223806" MODIFIED="1522699240168" TEXT="das ist praktisch die bestehende Lösung"/>
|
||||
<node CREATED="1522699240684" ID="ID_600377865" MODIFIED="1522699259238" TEXT="wird dort nur indirekt über die Instanz der freinen Funktionen ausgelöet"/>
|
||||
|
|
@ -28663,7 +28689,8 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1522724948516" ID="ID_1547993807" MODIFIED="1522724964722" TEXT="explizite Instantiierung notwendig">
|
||||
<node CREATED="1522724948516" ID="ID_1547993807" MODIFIED="1522729247734" TEXT="explizite Instantiierung notwendig">
|
||||
<linktarget COLOR="#a02659" DESTINATION="ID_1547993807" ENDARROW="Default" ENDINCLINATION="231;-29;" ID="Arrow_ID_1421481593" SOURCE="ID_242747417" STARTARROW="None" STARTINCLINATION="544;-14;"/>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1522724966777" ID="ID_650754221" MODIFIED="1522724973013" TEXT="häßlich und umständlich"/>
|
||||
<node CREATED="1522724973625" ID="ID_1016558302" MODIFIED="1522724976780" TEXT="Code dupliziert"/>
|
||||
|
|
@ -28677,8 +28704,8 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1522649565217" ID="ID_1192073765" MODIFIED="1522649581256" TEXT="Probleme bei der Realisierung">
|
||||
<icon BUILTIN="flag-pink"/>
|
||||
<node COLOR="#338800" CREATED="1522649565217" FOLDED="true" ID="ID_1192073765" MODIFIED="1522728960801" TEXT="Probleme bei der Realisierung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1522649583511" ID="ID_709785832" MODIFIED="1522649600993" TEXT="Instancehandle muß jetzt die Proxy-Implementierung sehen"/>
|
||||
<node CREATED="1522649601916" ID="ID_114261035" MODIFIED="1522649700061" TEXT="die beiden Seiten des Bindings sind damit fest verkoppelt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -28727,8 +28754,8 @@
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522709654308" ID="ID_1059248114" MODIFIED="1522709793386" TEXT="bestehenden Code umschreiben">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1522709654308" FOLDED="true" ID="ID_1059248114" MODIFIED="1522728958026" TEXT="bestehenden Code umschreiben">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522709669498" ID="ID_9288802" MODIFIED="1522724927071" TEXT="alle bestehenden Proxies">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522635397309" ID="ID_590180071" MODIFIED="1522724921600" TEXT="SessionCommandService">
|
||||
|
|
@ -28772,8 +28799,8 @@
|
|||
<node COLOR="#338800" CREATED="1522709756798" ID="ID_1024028685" MODIFIED="1522717913716" TEXT="Header umorganisieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522709763388" ID="ID_778622044" MODIFIED="1522709775687" TEXT="Doxygen-Doku aktualisieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1522709763388" ID="ID_778622044" MODIFIED="1522728945187" TEXT="Doxygen-Doku aktualisieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -28781,7 +28808,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1522033564057" ID="ID_1294295502" MODIFIED="1522632239961" TEXT="Nacharbeiten">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522454023039" ID="ID_1828121921" MODIFIED="1522630470765" TEXT="Folge-Probleme">
|
||||
<node COLOR="#338800" CREATED="1522454023039" FOLDED="true" ID="ID_1828121921" MODIFIED="1522729272839" TEXT="Folge-Probleme">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1522454040500" ID="ID_1674154774" MODIFIED="1522640613359" TEXT="Architektur">
|
||||
<node CREATED="1522454061873" ID="ID_1012349550" MODIFIED="1522454068316" TEXT="unklare statische Abhängigkeiten">
|
||||
|
|
|
|||
Loading…
Reference in a new issue