DI: draft configuration for using a service implementation created elsewhere
This commit is contained in:
parent
9f93154f62
commit
5516700523
2 changed files with 93 additions and 8 deletions
|
|
@ -200,6 +200,24 @@ class DependInject
|
|||
Depend<SRV>::factory = Depend<SRV>::disabledFactory;
|
||||
}
|
||||
|
||||
static void
|
||||
activateServiceAccess (SRV& newInstance)
|
||||
{
|
||||
ClassLock<SRV> guard;
|
||||
if (Depend<SRV>::instance)
|
||||
throw error::Logic("Attempt to activate an external service implementation, "
|
||||
"but another instance has already been dependency-injected."
|
||||
, error::LUMIERA_ERROR_LIFECYCLE);
|
||||
Depend<SRV>::instance = &newInstance;
|
||||
}
|
||||
|
||||
static void
|
||||
deactivateServiceAccess()
|
||||
{
|
||||
ClassLock<SRV> guard;
|
||||
Depend<SRV>::instance = nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<class SUB>
|
||||
|
|
@ -214,13 +232,42 @@ class DependInject
|
|||
});
|
||||
}
|
||||
|
||||
|
||||
template<class IMP>
|
||||
class ServiceInstance
|
||||
{
|
||||
std::unique_ptr<IMP> instance_;
|
||||
|
||||
public:
|
||||
ServiceInstance()
|
||||
: instance_(new IMP{})
|
||||
{
|
||||
|
||||
activateServiceAccess (*instance_);
|
||||
}
|
||||
|
||||
~ServiceInstance()
|
||||
{
|
||||
deactivateServiceAccess();
|
||||
}
|
||||
|
||||
explicit
|
||||
operator bool() const
|
||||
{
|
||||
return bool(instance_);
|
||||
}
|
||||
|
||||
IMP&
|
||||
operator* () const
|
||||
{
|
||||
ENSURE (instance_);
|
||||
return *instance_;
|
||||
}
|
||||
|
||||
IMP*
|
||||
operator-> () const
|
||||
{
|
||||
ENSURE (instance_);
|
||||
return instance_.get();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -256,7 +303,7 @@ struct Dummy
|
|||
~Dummy() { checksum -= N; cout << "~Dummy<"<<N<<">"<<endl;}
|
||||
|
||||
virtual int
|
||||
probe()
|
||||
probe() override
|
||||
{
|
||||
return N * checksum;
|
||||
}
|
||||
|
|
@ -290,6 +337,35 @@ main (int, char**)
|
|||
SHOW_EXPR( Depend<Dum>{}().probe() );
|
||||
SHOW_EXPR( checksum );
|
||||
|
||||
struct SubDummy
|
||||
: Dummy<3>
|
||||
{
|
||||
virtual int
|
||||
probe() override
|
||||
{
|
||||
return -checksum + offset;
|
||||
}
|
||||
|
||||
int offset = 0;
|
||||
};
|
||||
|
||||
Depend<Dummy<3>> dep3;
|
||||
SHOW_EXPR( checksum );
|
||||
{
|
||||
DependInject<Dummy<3>>::ServiceInstance<SubDummy> service{};
|
||||
CHECK (service);
|
||||
SHOW_EXPR( checksum );
|
||||
SHOW_EXPR( dep3().probe() );
|
||||
SHOW_EXPR( checksum );
|
||||
service->offset = 5;
|
||||
SHOW_EXPR( dep3().probe() );
|
||||
SHOW_EXPR( checksum );
|
||||
}
|
||||
SHOW_EXPR( checksum );
|
||||
SHOW_EXPR( dep3().probe() );
|
||||
VERIFY_ERROR (LIFECYCLE, DependInject<Dum>::ServiceInstance<SubDummy>{} );
|
||||
SHOW_EXPR( checksum );
|
||||
|
||||
|
||||
cout << "\n.gulp.\n";
|
||||
|
||||
|
|
|
|||
|
|
@ -26807,8 +26807,10 @@
|
|||
</node>
|
||||
<node CREATED="1521208257336" ID="ID_1129640741" MODIFIED="1521208261323" TEXT="ServiceInstance">
|
||||
<node CREATED="1521208859989" ID="ID_549061661" MODIFIED="1521208874756" TEXT="Lazy-Init-Factory deaktivieren"/>
|
||||
<node CREATED="1521208793630" ID="ID_1357481546" MODIFIED="1521208825093" TEXT="Service-Zugang in Depend<Bla> injizieren"/>
|
||||
<node CREATED="1521208889297" ID="ID_214019029" MODIFIED="1521208932875" TEXT="Lebenszyklus-Koppelung">
|
||||
<node COLOR="#338800" CREATED="1521208793630" ID="ID_1357481546" MODIFIED="1521335430941" TEXT="Service-Zugang in Depend<Bla> injizieren">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521208889297" ID="ID_214019029" MODIFIED="1521335434588" TEXT="Lebenszyklus-Koppelung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -26823,9 +26825,14 @@
|
|||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521208943105" ID="ID_295121984" MODIFIED="1521335440371" TEXT="Ownership an übergebener Service-Impl übernehmen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1521208724943" ID="ID_1527628667" MODIFIED="1521335442003" TEXT="smart-ptr-artiger Zugriff auf die Service-Impl">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1521208943105" ID="ID_295121984" MODIFIED="1521208976657" TEXT="Ownership an übergebener Service-Impl übernehmen"/>
|
||||
<node CREATED="1521208724943" ID="ID_1527628667" MODIFIED="1521208881882" TEXT="smart-ptr-artiger Zugriff auf die Service-Impl"/>
|
||||
</node>
|
||||
<node CREATED="1521208261887" ID="ID_384054163" MODIFIED="1521208264827" TEXT="Local">
|
||||
<node CREATED="1521209044203" ID="ID_1994153994" MODIFIED="1521209058181" TEXT="Closure über konkreten Ctor"/>
|
||||
|
|
@ -27006,7 +27013,7 @@
|
|||
</node>
|
||||
<node COLOR="#338800" CREATED="1521324229082" ID="ID_1398878858" MODIFIED="1521326553373" TEXT="Storage">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1521324240124" ID="ID_1099103129" MODIFIED="1521324253936">
|
||||
<node CREATED="1521324240124" ID="ID_1099103129" MODIFIED="1521333223154">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -27018,8 +27025,10 @@
|
|||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1521324275919" ID="ID_1710451095" MODIFIED="1521324497413" TEXT="sehe aber auch keinen wirklichen Vorteil">
|
||||
<node CREATED="1521324275919" ID="ID_1710451095" MODIFIED="1521333231077" TEXT="sehe aber auch keinen wirklichen Vorteil">
|
||||
<icon BUILTIN="smiley-neutral"/>
|
||||
<node CREATED="1521324529228" ID="ID_1786667023" MODIFIED="1521324543094" TEXT="man muß sich nicht um die de-Allokation kümmern"/>
|
||||
<node CREATED="1521324554465" ID="ID_1577416641" MODIFIED="1521324568043" TEXT="Storage ist garantiert vorhanden, kein out-of-Memory"/>
|
||||
<node CREATED="1521324668449" ID="ID_1013908061" MODIFIED="1521324682434" TEXT="Meyers Singleton ist elegant und schnell"/>
|
||||
|
|
|
|||
Loading…
Reference in a new issue