DI: safer to make DependencyFactor noncopyable
...and to use a dedicated function for transferring the definition
This commit is contained in:
parent
cc46c5b04b
commit
562c14e15d
3 changed files with 90 additions and 19 deletions
|
|
@ -286,8 +286,7 @@ namespace lib {
|
|||
~Local()
|
||||
{
|
||||
restoreOriginalFactory (origInstance_, move(origFactory_));
|
||||
origFactory_ = Factory{};
|
||||
} // clear possibly leftover deleter
|
||||
}
|
||||
|
||||
explicit
|
||||
operator bool() const
|
||||
|
|
@ -387,9 +386,9 @@ namespace lib {
|
|||
temporarilyInstallAlternateFactory (SRV*& stashInstance, Factory& stashFac, FUN&& newFac)
|
||||
{
|
||||
Lock guard;
|
||||
stashFac = move(Depend<SRV>::factory); //////////////////////////////////////TICKET #1059 : GCC-4.9 stubbornly picks the copy assignment
|
||||
stashFac.transferDefinition (move (Depend<SRV>::factory));
|
||||
stashInstance = Depend<SRV>::instance;
|
||||
Depend<SRV>::factory.defineCreator (forward<FUN>(newFac)); //////////////////////////////////////TICKET #1059 : GCC-4.9 stubbornly picks the copy assignment
|
||||
Depend<SRV>::factory.defineCreator (forward<FUN>(newFac));
|
||||
Depend<SRV>::instance = nullptr;
|
||||
}
|
||||
|
||||
|
|
@ -397,7 +396,7 @@ namespace lib {
|
|||
restoreOriginalFactory (SRV*& stashInstance, Factory&& stashFac)
|
||||
{
|
||||
Lock guard;
|
||||
Depend<SRV>::factory = move(stashFac); //////////////////////////////////////TICKET #1059 : GCC-4.9 stubbornly picks the copy assignment
|
||||
Depend<SRV>::factory.transferDefinition (move (stashFac));
|
||||
Depend<SRV>::instance = stashInstance;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -186,6 +186,15 @@ namespace lib {
|
|||
deleter_ = std::forward<FUN> (additionalAction);
|
||||
}
|
||||
|
||||
void
|
||||
transferDefinition (DependencyFactory&& source)
|
||||
{
|
||||
creator_ = std::move (source.creator_);
|
||||
deleter_ = std::move (source.deleter_);
|
||||
source.creator_ = Creator();
|
||||
source.deleter_ = Deleter(); // clear possible leftover deleter
|
||||
}
|
||||
|
||||
private:
|
||||
OBJ*
|
||||
buildAndManage()
|
||||
|
|
|
|||
|
|
@ -27153,7 +27153,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521169086441" ID="ID_284471203" MODIFIED="1521418328021" TEXT="Design">
|
||||
<node COLOR="#338800" CREATED="1521169086441" FOLDED="true" ID="ID_284471203" MODIFIED="1522389263020" TEXT="Design">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1521240056932" ID="ID_1189728630" MODIFIED="1521240061863" TEXT="Strukturen">
|
||||
<node CREATED="1521240105285" ID="ID_711335043" MODIFIED="1521240109744" TEXT="Dependency-Factory">
|
||||
|
|
@ -27177,6 +27177,12 @@
|
|||
<linktarget COLOR="#b4a9c1" DESTINATION="ID_1336783261" ENDARROW="Default" ENDINCLINATION="224;0;" ID="Arrow_ID_37940927" SOURCE="ID_870619413" STARTARROW="None" STARTINCLINATION="83;-7;"/>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522389217216" ID="ID_1137026613" MODIFIED="1522389254396" TEXT="bekommt neue Rolle">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1522389224063" ID="ID_913743224" MODIFIED="1522389235913" TEXT="speichert ctor und automatischen dtor"/>
|
||||
<node CREATED="1522389236525" ID="ID_773636278" MODIFIED="1522389243256" TEXT="übernimmt das Managen der Objekte"/>
|
||||
<node CREATED="1522389243868" ID="ID_104693188" MODIFIED="1522389252479" TEXT="ist interne Schnittstelle zur Konfiguration"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1521242246702" ID="ID_650712800" MODIFIED="1521242253953" TEXT="DependInject">
|
||||
<node CREATED="1521242468983" ID="ID_956915310" MODIFIED="1521242481313" TEXT="ist nur ein Lebenszyklus-Manager"/>
|
||||
|
|
@ -27347,15 +27353,15 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521160691830" ID="ID_53329830" MODIFIED="1521885000400" TEXT="Implementierung ausführen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1521160691830" ID="ID_53329830" MODIFIED="1522388786880" TEXT="Implementierung ausführen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1521418559868" ID="ID_592269917" MODIFIED="1521688403021" TEXT="Depend<SRV> Front-End">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521418571594" ID="ID_1432227459" MODIFIED="1521688407751" TEXT="DependInject<SRV> ersetzt dependency-factory.hpp">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521418598463" ID="ID_237484313" MODIFIED="1521696529892" TEXT="Objekterzeugung erweitern">
|
||||
<node COLOR="#338800" CREATED="1521418598463" FOLDED="true" ID="ID_237484313" MODIFIED="1522389194597" TEXT="Objekterzeugung erweitern">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#990000" CREATED="1521418618052" ID="ID_1253147848" MODIFIED="1521688468798" TEXT="auf beliebige Argumente">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
|
|
@ -27401,10 +27407,19 @@
|
|||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="smily_bad"/>
|
||||
<node COLOR="#338800" CREATED="1522389159792" ID="ID_1574961457" MODIFIED="1522389181299" TEXT="besserer Name">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522389172206" ID="ID_14747848" MODIFIED="1522389177726" TEXT="komplettes Refactoring">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1522389165095" ID="ID_533975153" MODIFIED="1522389170272" TEXT="DependencyFactory">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521433938944" ID="ID_546086969" MODIFIED="1521884986940" TEXT="double-checked-locking">
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521433938944" FOLDED="true" ID="ID_546086969" MODIFIED="1522389196419" TEXT="double-checked-locking">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1521433948534" ID="ID_176845865" MODIFIED="1521882845033" TEXT="umstellen auf atomics">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -27697,7 +27712,7 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522110414912" ID="ID_1861060212" MODIFIED="1522388012137" TEXT="Singleton-Erzeugung zusammenführen">
|
||||
<node COLOR="#338800" CREATED="1522110414912" FOLDED="true" ID="ID_1861060212" MODIFIED="1522388800716" TEXT="Singleton-Erzeugung zusammenführen">
|
||||
<linktarget COLOR="#5f8d94" DESTINATION="ID_1861060212" ENDARROW="Default" ENDINCLINATION="-566;0;" ID="Arrow_ID_319700222" SOURCE="ID_1624172022" STARTARROW="None" STARTINCLINATION="205;-440;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1522110563499" ID="ID_470760423" MODIFIED="1522113397796" TEXT="stets ausführend">
|
||||
|
|
@ -27834,12 +27849,23 @@
|
|||
</richcontent>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522387936585" ID="ID_1922190351" MODIFIED="1522388036540" TEXT="es wäre besser, wenn Factory überhaupt nicht assignable wäre">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1522387936585" ID="ID_1922190351" MODIFIED="1522388778471" TEXT="es wäre besser, wenn Factory überhaupt nicht assignable wäre">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...und man stattdessen explizit eine <i>gefährliche Funktion</i>  aufrufen muß
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522334796724" ID="ID_1080992734" MODIFIED="1522384890030" TEXT="Funktoren zusammenführen">
|
||||
<node COLOR="#338800" CREATED="1522334796724" FOLDED="true" ID="ID_1080992734" MODIFIED="1522388803386" TEXT="Funktoren zusammenführen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1522334843062" FOLDED="true" ID="ID_1526236017" MODIFIED="1522385032004" TEXT="DependencyFactory für">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -28100,8 +28126,8 @@
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1521160765588" ID="ID_1857896991" MODIFIED="1521160801792" TEXT="Konfig-Aufrufe anpassen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033578207" HGAP="18" ID="ID_252429770" MODIFIED="1522035653422" TEXT="Name für Freunschaft+?" VSHIFT="-20">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1522033578207" HGAP="18" ID="ID_252429770" MODIFIED="1522389026807" 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">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
|
|
@ -28110,12 +28136,49 @@
|
|||
<icon BUILTIN="smiley-angry"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033635991" ID="ID_321432260" MODIFIED="1522033646528" TEXT="könnte das Depend selber sein?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1522033635991" ID="ID_321432260" MODIFIED="1522388978649" TEXT="könnte das Depend selber sein?">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1522388820751" ID="ID_721931573" MODIFIED="1522388962542" TEXT="ist doch ehr ein irreführender Name">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...wenn man nämlicht Lumiera's Lösung nicht genau kennt,
|
||||
</p>
|
||||
<p>
|
||||
könnte sich das so lesen, als wäre Depend<X> ein Mixin,
|
||||
</p>
|
||||
<p>
|
||||
welches einer Klasse <i>magisch</i> eine Dependency als protected-Feld zugänglich macht.
|
||||
</p>
|
||||
<p>
|
||||
Und dann wäre es ziemlich pervasiv, sowas zum Freund zu erklären.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522110432870" ID="ID_1624172022" MODIFIED="1522110495402" TEXT="dann müßten alle Singletons an einer Stelle erzeugt werden">
|
||||
<node COLOR="#338800" CREATED="1522388857786" ID="ID_1151074517" MODIFIED="1522389011363">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<b>DependencyFactory</b> ist viel besser geeignet
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1522110432870" ID="ID_1624172022" MODIFIED="1522388983897" TEXT="dann müßten alle Singletons an einer Stelle erzeugt werden">
|
||||
<arrowlink COLOR="#5f8d94" DESTINATION="ID_1861060212" ENDARROW="Default" ENDINCLINATION="-566;0;" ID="Arrow_ID_319700222" STARTARROW="None" STARTINCLINATION="205;-440;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1522033193572" ID="ID_508353720" MODIFIED="1522033212243" TEXT="DependencyFactory">
|
||||
|
|
|
|||
Loading…
Reference in a new issue