From 61e6f2db609f496a38b338213968b24a80ad7ab1 Mon Sep 17 00:00:00 2001 From: Roman Mogilatov Date: Mon, 23 Nov 2015 14:43:11 +0200 Subject: [PATCH] Update singleton provider docs, including API, and examples --- dependency_injector/providers.py | 95 +++++++++++++++--- docs/images/providers/singleton.png | Bin 10265 -> 25308 bytes docs/images/providers/singleton_internals.png | Bin 10589 -> 26376 bytes docs/providers/singleton.rst | 56 ++++++----- examples/providers/singleton.py | 6 +- examples/providers/singleton_delegation.py | 8 +- examples/providers/singleton_reseting.py | 6 +- 7 files changed, 122 insertions(+), 49 deletions(-) diff --git a/dependency_injector/providers.py b/dependency_injector/providers.py index 00f9a024..f5a9055e 100644 --- a/dependency_injector/providers.py +++ b/dependency_injector/providers.py @@ -268,9 +268,15 @@ class Factory(Provider): class Singleton(Provider): - """Singleton provider. + """:py:class:`Singleton` provider returns same instance on every call. - Singleton provider will create instance once and return it on every call. + :py:class:`Singleton` provider creates instance once and return it on every + call. :py:class:`Singleton` uses :py:class:`Factory` for creation of + instance, so, please follow :py:class:`Factory` documentation to go inside + with injections syntax. + + :py:class:`Singleton` is thread-safe and could be used in multithreading + environment without any negative impact. """ __slots__ = ('instance', 'factory') @@ -278,25 +284,90 @@ class Singleton(Provider): def __init__(self, provides, *args, **kwargs): """Initializer.""" self.instance = None + """Read-only reference to singleton's instance. + + :type: object + """ + self.factory = Factory(provides, *args, **kwargs) + """Singleton's factory object. + + :type: :py:class:`Factory` + """ + super(Singleton, self).__init__() + @property + def provides(self): + """Class or other callable that provides object for creation. + + :type: type | callable + """ + return self.factory.provides + + @property + def args(self): + """Tuple of positional argument injections. + + :type: tuple[:py:class:`dependency_injector.injections.Arg`] + """ + return self.factory.args + + @property + def kwargs(self): + """Tuple of keyword argument injections. + + :type: tuple[:py:class:`dependency_injector.injections.KwArg`] + """ + return self.factory.kwargs + + @property + def attributes(self): + """Tuple of attribute injections. + + :type: tuple[:py:class:`dependency_injector.injections.Attribute`] + """ + return self.factory.attributes + + @property + def methods(self): + """Tuple of method injections. + + :type: tuple[:py:class:`dependency_injector.injections.Method`] + """ + return self.factory.methods + + @property + def injections(self): + """Read-only tuple of all injections. + + :rtype: tuple[:py:class:`dependency_injector.injections.Injection`] + """ + return self.factory.injections + + def reset(self): + """Reset cached instance, if any. + + :rtype: None + """ + self.instance = None + def _provide(self, *args, **kwargs): - """Return provided instance.""" + """Return provided instance. + + :param args: tuple of context positional arguments + :type args: tuple[object] + + :param kwargs: dictionary of context keyword arguments + :type kwargs: dict[str, object] + + :rtype: object + """ with GLOBAL_LOCK: if not self.instance: self.instance = self.factory(*args, **kwargs) return self.instance - def reset(self): - """Reset instance.""" - self.instance = None - - @property - def injections(self): - """Return tuple of all injections.""" - return self.factory.injections - class ExternalDependency(Provider): """External dependency provider. diff --git a/docs/images/providers/singleton.png b/docs/images/providers/singleton.png index 595d359f4141b47a939dad4e43e4ff7ca458974e..3cc3f5983e6af5e0c9dc444b37d45b75210c507e 100644 GIT binary patch literal 25308 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 literal 10265 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 diff --git a/docs/images/providers/singleton_internals.png b/docs/images/providers/singleton_internals.png index f05fb9022086b37d88b181c952bb0b6c5405c037..a327f390050e4cb5ab19575c9e9515529c5758c0 100644 GIT binary patch literal 26376 zcmeFZ2T;>Zv^R{sAfPCqD4-ysv`CjO(tGcaNbexMgn){IfPjDy=}Hkp3oY~nmEJoc z^xi`#AwYoeM!nB-pXVzx@63B=?l*HkW*G9{J$rWd>}mhs*$}R!p-6R^@iGMk1(mXr zoDK!Wc_anJ>5YqL$SwCpdHBeG&f3YS%TQ31#84htoFhM<^3+j$Mp4v#XNCN5*Gfr8 zoq{6Z0R_d&Hxv{^a?{IY3JUMX6cnq^DJaA~QBW|vNUhP9Adi#LQqz+^IXO8zJe-=E z%E`%bb#>+C^(v*Or~2KyblKT1#l_xIQjbhbB;@3HUcEASprs`J#z!MF z&ZH*y_>kcG{4pY3YpTKWWXk>GH5!$q@T2{W*-9lGI_2h#%l(z+MwQvq#lnYUZp%$h zq~k+u|9gXy44u5B)lNGxKWCPwV#ewmJU~4Gr{_5zlpFI6uHIwD4>{lDapqSqL}{tdwr4y(bDH9Ccfr+wakV3GYXY{n-g~e$rugx#T1JdS(2KHE&9rd& zAXkx2a5ghpWTz}u73C=2onulWKU{jDWb8>n!OQmR_mp3bv=0S^H9}cVM$c~)i=+h2 zb*6t3#i=LVchg{GOzutlVD0;iI=&NF<5D&4RMP3)d+EZ%Q8ny}D1eM%5qL$zQlZ5qL%V_{(zOnGYN%sU(K)z|R4| z3~FlWGwa-nVJ#qy_w}T6BHt<6dwN($HS6iq0x2fDMc9gi58x5eToitGLA2L}HF_d6 z#3>G59Kmx?q^^1%u~Ld@NUS*^0H{SD-MKsytm|ce>U-^WWYvN+$sRoR(`) zRKwBd<@aYk+VFlXAtZ}{MQPL89q{% zj5kjm?U9)el9@AEPAcG~kA5+{MP7)kT5=3YkxXezri>}WmF_i7-+LPV1E}>36@E@6 zvtC(kV%nvHBIh(%=9cJ3VgzXvys+^5{EI%Ya%Vlbz(yH*=n%`W5nXU7)1q=voE? zlPkrC+ar|ioqa!Ybu~dJ1_evE>MWRLOuuW|Li3%|2wc45O}?QU83ZQ7Hu)ZI+f+}CJO_TJH-c@ z5lX^&KCgY%zH1jK4qhUkyIn1#4(1V?rMS!Ti!e-WjN;)hqR^~;=rIf3Ut=z8jRCzH zPd$}-4j3U5KJ_P0A^jZia+}N|_&bnd;S~4>=_Qh){S4vt@hR}Bj~CX@9iAba{>_X0 zS&Ny>oy_;M#D6)1&C_5eX67JphP8*!evnPD868kwaSbKeek9Bxl^sXpOcW{MLp%Oj z^oTXQj3w6+8tL0+9G1DfiDM0V!Ok**-xA}Lwk{shokzks9nrbM6-h9#sq_}$7_|okDk(tI532A9*(h)mpYNyAJA-B(W7mEfg zacucYQ+KPCh9A%#&UUo5LE)ASeLwb==XE0vqk~iBrsg2Dj^Q2RQNH!PAs?r@Z4inK z85&tT0A8n{+IRVql9df=mX&8p4#0K0BO8QWRkOVqxSd@PU07zs{)k&Rr(9%KyeEK< zh3TDJP;31Dk#e9ghkF5y@j}Y6LhwF8zI@rK-Cfm=^NBe9P@tI9fOw=q#yiS%Z&*Df zLZkkEFtF`G;IYTHxw)9TKkDSkc8rwx{*99xc;y-&9z)No8OB}#M+;^bg^0Ytjctte z5UIK+409dfv-QWtQR4g8f*}DU`Lq*5e;4&j#8o1C=^-x`Kk!5QC(w=|WA^+fel>PQ z>CENGnxNIVgWM1#g^GG2l9#pPtp+=T?May?p*9}QE0mgloVgq?dE~|Z<*4@pX>)y{ zec&+P`0A9#u0cG4x-)b+5|q#5Q613(qyss}#~?YarCV6;N{WlrLKqJABMp;AMG$9Z zZC$bvttko9X)wB4mm~>)T#X%YH9p66K|b@6bZ5BvNXHkhkBS)(O~J>B&DHsfz4?o3 zdY&^VGuYPtV-uc9p^eQ(CeEUz*rRXi94GDpi=d1KUESmY-6VYeammROQ=-lFgb`5u zzFne_&M#|fSX=jY*2#nNI=ezIHL2;mr>@7CRp}L|HZKX^PCr;+GQAz>k%U|8FL{7% zXN`u|;Ty2?dHWko;ORG3U0(!NMGSL0TNEcn_cO|{3npHlZgljuCk52#rNj~1QG;t( zZ`VjsVzOY&krzsD-Xb$Oq^HfYbbYst8HQ(P@^JQ%+>Dfz6bwGKT(3Zlr|B1(s1PD< zko5Lv6Sj^!^=Ok+Xrar3vY^?+Og3tYZJFFwJzBOfen{GYBL>7dX|^swXn9Bd2_Q*P)a{XAT`5B}Eb5%7{Q!=DfVB zUVSqoU8cPAV^+a_KB9)24w19n*jstlDM8Yl4gk3PRJ>)Zi&*uOL}sakFiwHgK+!%P zaf2+cfcX~_IRjJL(RjOwh@^ z`HxmJgT5-Zp6)13P$1F$cZCYWP>lyc8ezMJk;Dniw0i)q%))RwD*g_5C1g#WOTs zdrfZBeMS^tVjE($H*hnQ5qmK)Z#GgmVWX|ufaz9DP?>(} z+N_3isky)__cmauyj_L7u=vRfJMSV&@sgD8_opPlh4q76dsDnR$yYHu2XW(zyl=;s z_2+nHtcxOeB!_@uZK1@d!^MOb&ZKAi*1-}LfRs8Z>2Xr#9sfxVI|660dER_$^4?D6 zoa_ep)cOTL1)Aot64Ay)+~J51Oq(44Heyk3_T$TOx93>3s{94938n!5o^htF^Bbt7 zm~_3K>%rq0)i?ZHxA7%oKK6N=9`IW~`+X}=tNNDppPYlH+sSbxL@v_IN2=08ujxVH zBYHV03AItD;~Y}S_#1XG1i`bPUPU`uNx;2g!{ug1mqhH(Lem}LJsS*-Bsu(MnzYI{ zv!Jgc?Zaaz=WQZ)+h|6zBSCztVx_NHNctu@TxtNF;gkRxcH0`z{nEsgtZCbe1*2<$ zD`o8^mh|`oUum1P`+K^Mv9)RNVMo*LOimOdIIa4+q?+J_hjrY3HOD3uVf$=CF|<1N zre`L>l&%gm@>Mm>0^krNzWg;XIQ?jt6bRJnG6ARMGVOX-D^Chlq#5r$37P207<78l$@OWiG+YmxRHw`yCc#FNO$GDyZH>aAWrz94a;2 zE=TLG+jtW8a;)Od#OAeu1n9@b``QRC$y^ELXopgHRoKMbZC33E2XF?HOvf&>on;&EE?$m*cBpqX+!KPSbWmsn(Ho8AIp00tQY1D2_t^rNQbQX z9<`9ex;|iAY(q$62^T@kY+#RA@ZcHg-LT|3!V;b{IlWz+9Q<|aD6(3Id@9E(V9Y_l zA~TfN0TEeQ5VuPpmf|tet6{;SY3_|ZhqY5sbpzOt@9c?M_k@tRSqaqabyK@b*9b2; zzoIk6s6H?g7}>QELfc?EG+Ww?Z#%@i^{0KJISJmmt}{-%TEJ4I=ec>1Lm;B` zYJ)$*MZ7nroT(IBiW=t&sN7&QhXTforjj6+t|TKS?wnXvXwCAwGcN;2+JWJ>S+@b! z;<7IOQwb7>U59I<8g?f$9HM|%YjW14*C)ww%L8UJLOn%@SWA>3S#hJoTh}?3iu%GP zmEqgZz-e$5{CJz3ghgObmDtjY;~b#7@+br@2!??z7I9%^369j#^@BiSm;oCir-F%uy4 zg(VO#@A`ZH>bwb&oris~s)!$UJTx@~NfO4oW%i6OH*y{Jxq>ig;><`Rbs|HQSR1N%WdkBrk$9Lg_D=I?ardF50 z<^^u4#BhkWZJ+r=?X;=e8bFrncoZ}tFbJn~G!g?{_x9UbIrN32cHQtl$f>l2I2fkq z?cto*qNX+851-7^ava!WgYYzcbt@{Rf(AH& z!xuF0aV?5P$?&y&(c(kiF)p!_ulhTXg>RI|5K&SufLlfCGQ`50p;8v0H=DjoAKdnh z?p{3)rlYpn)>gn0@Up)w4cWISFDmYIEC zXIO^y<#KFj5(N$Ku+t1VrE%o#6a1r)ao2Cxuic`sBgMURD}lC+t+vBv<0&!i<4(3p zu62WBV;w~hzYX4(`HMR$LW@fkrKPhlu2sKzPN=I?>y}51Hs|hwI9#emN_y$bCwj-7MXwZZ1H3V^ z;%FfY_#BXuTz{a+jN$g3t)J@1cFm_svDO46I_>6rvq6A#!>YNHL{4FMLKlNdEFzo{-AH7aye#GpzAMEu;Qv;;Zf~z$c~{c1G$$aE?)QKWPA5vAED~ad%E;U0%yKySQE01`XDlh#vU8O#)&P}-ZD`;?Ymtdh!)1#1j-9Sc3 zDu1id4Eo7unuu;r3YH%-M;#=m-vG;|>Yd(s)5iy#LFi!K z-{?yatqAHD4987@>%zdQu)DgyIEda82j${XpXUQ5bJosj@dh!-FhRtgFW&o@*bt(* zjXv7T%%Y;$p39Y%qX7S4xhZn?;q_nepw6lNi$RJ&3ii3BsfcbaGEcYhozo9lenX5m zuc&mm)swabm;nFdP}cvc8@?Ek5ky)*PqDuIu#ZK9f=ICC-n-{5Vlc069wmKy_4ok0 zlo=9o^Ud*t<(o$5?SKBqJ`1S`_B2dBWu)I~Ga6#RP+9mY`=q_Fm|FnE>EbPLVG@sGw_mbrIcK6i(On zP(jMa6Z+f4os1I_OGI>LWy`dF->u8fc?_Mbij9Jz#`Jl_WKI?2FrI{xk_q`v^N1ZH zEuRtKcO#1TJf*^wYJst-i*?i!=R3*F)sl6a*u?H7Rbr z1N9Ao%y{6z`(YDk=#w9rJJ+9{U*R(%d+^g7LLTqyNV5PR5QzMA0es3?)@1&Pf5Owh zA64e}w?`om3&2G(zFka}9~=J>-MvN$mYF7}t}aI5sW$%D8dNdES!%-Rkw@iJGr$ysIDhe#6AqbJx8C`qFk(b+8mb7<~w5B9jN4k{??;1%7*hph703 zlC;`IcB6gH6_%kVNF!_Kwnx<=7I20S8OVy1>iu`fpH_-k_6tV=P-GJ}(8qL0fVHur z$;R%9fbVO^hB0ly8YaR*J#iL%_@MjkzM(Xq$B6NG_o8p1Mn5oe#$Gu8iqoWf5Ids% z+pVS(qojV|maC6)o1EuB>lc@&M^nQS&Omp-MXbIz8~zb5CSSOqGbPI+KMVeoo8)TS z!U`U$)%KKP za&lzv%Bap^sEOT@HIKS7`3~o%c4?L+-qmt`6BRVX+`@i;eW+0S{g`IY?knF^P@C5s zr&R|tP`Y=0H*kXJHy(6H`aY`KpE;(5=FEhB-)=;6e7IEPk9q$)QSdl*wECz0GZ|F7 zO+_KdZ8;k}DxJP>eN0d!ZZ#GeJK0KoRZmVB*A_F%&vZN)QOw^c(2x141=4iehHg|rcG^fkW5If}bz)5v9Uto_h3k=Dl1&?TS*Fs}=Ed8;c zQSH|78lhK%&~mh&<@Q122^F2V5?ua_{!6t(?5T!UNt~ z>s1_F*c(3nmGB$`45{#y1J{hd2{r6R?jQLfcb>x~`21@{w>|3HiOMDKU5BX4RPDH5 ztv7N93N6QRJ{Y2O|MrYiR%mYmE8L&Z`qQpqb)u8YBuiezaH~S@#5C=#9yRyWcuy=mkXYS$2NQ4F5FFvsEJx06^jg{ul#=M` z3la2U&`4?(&4YYL1xlOKP?i*EI^$r~Y=JGoclK(Cm&XmAo4qO;2K;3TH;qr-a*na{ zG2IP#t_*I1WNWy%GWr?oo>p;a><#1s`)$t?ZR3*>Uu;9)flXKA{0d#D#S4>kN29Na z90mtP)%j?E7E00cHTj_vaw77+Z${&r%fIB@t&ycd;GV|N=S4>x`FUeS70C9nXM56W zz}Cp2crQcUl};#9WkY?a9TJnTZdMAt(U}EP7nUD7>_u)wM}@lVX|vo7uqH~dm|Y+A zA5Ig_NNx3DTusX1`=LEOuNj_#lAoWOzI`;W#EbsHODXjMvFrR*kEw;7Kj7HxHnDg-V zw6`|1uZNzSRQnqB!|^(FefM!REae7I-f|5vrLe0EdSsxEE?!Eqe})$BgL$?50Q&QL z0kt22vKNw67dQ)h@RRD;@I>{^%4Qb>s!8>d=xd5oT)lV1wkZ=8?2EwB`3qmY-dT+g z(%J!XI`Uw4}x{ltlA9%s_JI}uG^<9c*u?;^y zGTvS+^9rfTzcGM6XLWhF!{L6*c}e=p^zU^r_6ph|!&2&PszEXuC!vS1t#E|59%@&- zht&;NNYLSKXqPu_*Vbmk`7x>-oB3~y7$>Ql8JZPz&KoW^cv{xC*77fw4Ytl1S-y|E z8jDgU;2$G3-7F)J=RJ~ZwY3{Q4K-j?)#dt9ur9T7*BNc|zrm6GZowCR3mP_M^8)m= zV$a=wWj9|9nr~B&aQw6a=S98_Rjps!>5$ud$am=lN-5)7Up|%Mqn{k$ zqaIF7ySrC$gQ2e1da8o1;1!+44uVeQT-`7}&~6v9 zlXD4KHb4l#-kp{{g7hhjYJyi#XxU_>!67iS{yx}<#&P<^?B!CCuA^i4?)Paw%OoJY zfORMhSiKZum{OH}9g|0BupWJkt;IOQ@hGU%t9?WBXs*O*3%JvI0)RiOr>>{NQaeUq z4LQM}7`O16a2(K8$W`5UWw9ENZXF%`SXfnhB$@kO44Gj_jj)k# zPPj4{HluvlnTS|40ka3ZX*&eF?k%-~j;;2{x;EP*T5h@NSr1^wi2^XPu*vFZozYZT z@d^0S-djN@gH1$8e5k(;{Z162RAlI*r)kB;d}_nI<=gZ)+jMC+UEVh8v9;jfLX?jR zFsBrn?m41S2K~)Uv{Ts6LqjRW^NG+ob)?DBcul~$+WdUMoDnC-+e42D+qPT2EKO%) ze~gNT!Im7_8K2z4iIHQ%M`X71VCSX7hlvE4p0z7&r=CiFk-7QVGCi>dKd9whQ(HE{ zERMsK3f!SKJ4Tq&|iO$ zkS%A%cg#~J*V@mHu>d0tK(*{}9gJ$*VzUqUsGul)PiMu<$E0Y!rD%WoK{q(My3|%X zhH6YSBCqk45yf5*EKUK!KTPSY^tKU#eDx_~|HDI!1 zb#HpAv53l49Dn7TPX6kiAel+Au)g^4OIuiEk@cYGf7U%nwGRC%lP_JGzEi6I^o^2-@IF0XFGs;A&$$_Eo=j z-O_QqVd&_Tb2SiX74*R)z2a7m-^dyxcp)-ieB`2HeWjzrv$x<|iS@m;J`qV&%VfkD zWwO>yH~;bRYL1?cr;|gci7?zffeSSm?cJE(39yCv?`dwi2Wa&~Br) zU|o_Yj>`BaGy$(C6xE9KXc~s2nK>RrO{t}~Xd1@Dq_c%T-3OMe*PHrl)$0JX(*w?V z-;U4E-5NoC_p6Resft)`tGj88oc6CVE45<86)^@%S34}fg&beg?3^Ppoq1_4&cC8hL*jT`o3E|2POl z&S32q3&p1bt^9Mo%Xce4jtf7cGa{(-cr1&T@gL8ObjWt)0NPTi$iAN)0Zq0AeDxhn zUXWCKdrtyqH|7*IzM_2eeo=f% zN{Go>39x{hJ<3Olkp!FkaoBT-FXiT~mz@k3-Xc{(E1>DBpx^5n0z#qs0vGB_zDleht!*ObBT+mwA7noBy+hu8aXKnB(CW89|Nn;nCV3crLJ|=sZVtMI z25a-cHpe7O)A|pdp)MB%J+`C%DD|u6=N1G;`MwuI>O&rIYlK>fi(ac}gYa2K(Szpa zeJhvlhCH>pN(TS_)lmExJQ1Z3IV4DziKHKA#O!xLIs`XLe_=e z8`ouiP+l{feIA@~1ijs_XHJj)nzTX*NeB-`ZyAmzF~ z_bUYr)GsvdG+DiFj+0TWzU7V5vZ^%sow2tQsSJp|8 z(Yx*tI26I1L&kal(XP>Erw?pJ}IbL2l9rc3;EA(E(cQJN$*qL!y z4U{`PI3@2HyPLmt;c!HseR8==v`$D|49v6MM~0lr;xRg^Yr0fe4O_9SQuNQk-V%&f zhOT#YX4Sm$e40TQU6NtX#70PYeIcL;tG5y!9t`3i z_zHqP(bJ^8g1|)Ww7$+DKShW&`8tOVO5rE*iP2_BX6#im_eliWP47DF4MOr zwMStk?Q{B&uKML%Otl~(nWyvl{J6EOzlMNS^`x0woXa}}NpFL^w!UW7v$%hY51qT1 z%&Kv)Dw~Pp!@JUT>DN0hD_lUP58LQo&a@H}A;edp$D=Xk$+5D&V=9DbVtZ&xdT*R> zGiODRe(27p3R7G^CVx@kCIe9%6Rdl==;kd;`0IbGFLCe=Pwet*Dr9V}`0j*O$BYhR zNBg3I=)$m(pY*A+PmeU z0l_vl)!*Ti&En}H$7x*ql2j3n{$ zMM(aIlfm8@rL`ZJj`cj8P58+bDuFTC>y_oD4>Vf&>Z7@ohsCzb?RITZdQ63}a$`;# zj~=@-MRZRes{K*5xcFvmL1T5@sBtc19$n|#3?ALZRIi$+6WPM_am9&5iSpNL0E}vM zHw^f3U7?LRxzsRt2pE|yn1k#L{JDs&slLtx;)m?eoH#6edDJAfgpq(}C~b7`zG`O6inR>t-6v2vgPRJL6v&FnK63 z0Ybd723o`WbmZB{MSwrrs-zKcGbT6Rfm04V@xG8DPm*({ttiRZEi@LQi2d5o)9-6mIv(y`fh(U%FGlcT#ormGyNS_ z+17=^lTeu-@?Y}yNzvM0S$qzV6kc9W@R?HW)^t-geROC&xwmTmm5rIjQ~)BIT)3p7 zQjc5c8NInW^DM@6osRkUDnBKOOT7qfxPVzp@RFrH`o)Q?@wPr8DW3L(RG3C|wq-LZ z&vLogF_%INtZy#*^G=$*&FmXl{En+`{Vn;TZ{h;8%RQpbykn}o7x_&eP4WcNb#*;u z`%5#%KZr{?k8rDj)k_RZ$WnDHhL*INCH*Wz7gks2m}RH-Uk~y3bov?#Va=aykM&9N zm&|;7N2Gu!@YYwjKiu|ed$*yTZH?KgKcKqAQQ>+aa`5`|QjQT8{ZLs+Q;;NQVY+EW z54c24&;7TTpAH?5wS|Y?33O6x#^$$ucXc!qDQdRb#St5-js=Hhy>x>McqiTa=~BuK zT*>!LXIZ)h&E4_))l$V5yw`f>w)STfG=uA7I;ubp`o3bfq@|)cyakkjV{1Xgqka72 zA=BenS>wKVkhYnRWYLNWmI=Lczg?-2TI$VHEAlnLeoD)CyzlqtF&(DEo5K=3-1<7+ zX-qDFO751QMn6qqRuA1gy;%>BNYi^l#)(x}dgYO#ZkdCJ8&T}cj=3N`z2Cdc z3P}QIM0%ZQ*mdMwS(#xL6MF<|Lt{O$W|XZ^)7#3|aq1gSJCF*w3v())@jJN4h5j)D zZ@ZHm{M(uHRrLW^aQBMB<*8CKZx1;-viTF@hOgojRwe@WV2zI2u5YPb02W_u^F1+e z1)ockNm4a#iMXpdN|L7gOD zlJxZ4ABRL$Z54$a?b$ks8T%D3m^+mwqV{of2}c!7z9w&m%C+Vp*)?V85PZA7bFE$0 zJD5k8k!Tkd&zh1n@Awq-Qy6{k8X1cSm9!MH|LE_u9)E?`Jk$gY0l|>O$I4W9{ zp2+*C>2Y*c8iKrovoEhdeBN?tzQ2$U$BZjgSQVM*lQlHctzI@j*YhX)E;Y%NIdX2H zKY>P^znP3~o8>H&ZwgN&>ox)9X@AGj+a4{9;3goWS$>d?shgu>jBa&BQx-`lLh0gi zo1c=)stMRzJ>%P<^^HCkr+dQb?*(VKiyDJ#4NYVo5%M~e`~#W6X^##>c{fV1F69Ir z$AEN+C*l*|j*FNVf>+%&)#yZo&tz`S{IL;#0VuN!9=iZ+9V(~^$=>LcUOz;>N9DPa zELxb8U6w#|n~N6#|!H#@Fy&7L}E=b6$kNn>u}cEjor-PTV0EyP^0q0C=4QPK@; z*X%!~Tc#YU6)XMIq%zOao)ov9qK!h3n9g?gpy&FkeU zGJhT%NcXCB4BT%26~!t%(SCwcZL%ybxW4u7f~eD%1kYDiqPY`Q*1CD7^i-qy2n-E< z*y6<=2#zMqwIuiL@wjPYPPv$eZjX3?U_p(kXoXYk>SW=*M;eSH;Xrcb zz2pL7;mH@R_|oWuY^;#af|&ytfqk4VIEO5q`TDBXjw{E>Tec|3g$VROH9a+1CXHg8 zo}bGhy6n}c9*iJ`!zRtF;6MLtqo|t|$FY9y$MxR_z7`*8sq70#-$xhl&FJ0v9M^<3ww`Vohmmx!!bE%5H*;j@7s>Vwsx1&`Lf;dbT{Luk~q zCTQpPqlRD;f6L1Pgc_5)Wn+eZBhcd;PsuBHBlK(kyzzeG-tV=G%tsIACLkLaI|zLs&r8$h9Ahk$8{@OW$~f{K-nruT{bNAJEj-{<72uUTKLoxccduuJOX7EmJftho=Nn^E*gU@XA7@0~r#FG$ zc(O}W5G<8UJ&X{+Y|5x@rmQaI^)KET)=%2gZpQBuBVJq~y@|Xq#~$2m0mcBgV~cVV zW_JY}Yy6%a%rJuKG{^$XK~hLX{I%<0OoznB9CY92y7xjsZ`Av?jV2~ISMcS}>FRz9 z?R-68V;Lc9x4f}Un@^}kq~Nd-mSlhaQVw!($FyI6`1Uwaq;CHuuNR6Kh?XCq7Xou~`&iQf#Sef&R?yvjAdd{fZ<+>g|$y~c1 zvoUG!aw+#)7&3i#b9&U9dUqB@G!-c9E%1Eum>ewdz+f05IUogp`Jl9rrsh4mF8Y?o z{ob36z^hOGL_c|ja4cUCefWvCuU{O2v9)PoNcOu=^mFv3`2dHggNoj_<}|AcOvl#e z__gAxY;0U#O)T`)HSU=m@Mr;$(?B_fnxb&`?)m38IByM-GIH56D1R*ryY@eQA zL02vA5)+^bww$yLM_y+Czc6m~zZF6piZ`!^#on=URx4s|p$Ui5M?yJG7pi=@XdW19 z8d|p0fM0E?*SV0tK&(i^Jc}Bc+c(A)FHW>?7caF%8Met4Eb~DOeoZGa=F%E*R66^t zIrD1eBiHHu>h9VEO0qfpQ(6wrzD5_v4+*a~$xiNXsKqr_+h+vmy^b*b=RsDsJ`{I? zE0|BBYXZQ^o8;*6pNIUr5AfjX#+_HqcL}e*|B2%~{O!?W`CY%=!oQ})xPaSQvMdz; ziSLjn-B?h=Gg*rz-M8J6-TWu}$p3hU{#&X3M>Je}x_^V|0gn0axAe>b+V7MP#ndJx z&;KO=`CRsw3|d~F>cD>^X7XhbsFG7;uFs6|1BbVh$-{`BXaeBhqCO!-j0ameYbjpHRN{heyc{T`bqJ5 zyd#1n9Hnb0Y}~sB@FZuH|A51a?ZHD{$5{^mJ%n^q54ntel z2;1C3L_cu2Zfd>92Y&L^FvYBA73I*4Nc?P;TUcM<&67id`KV!d z=0WDI34J+nT&BH2nxgDh%w*W8s#yj)?Kv}{rU}SG_qUDuRvH!x-J#Ck_^O`IpDdph ziz!V*($}o%r;K^4CHrotOitL}=u-6knpJv}8Vrr>Q-YY@Hc;>_aSw1$8QgORINk`Z z^--B>E&Rxjn-ZFkc0?f?MM=<^-f=d@2U6`{2jg;iZujz4CWsZ*YUhkXWx+yavh1$t zUIN%jgi-%g4M}lxjZoDX>YQ^c`iJK&-4Obc)MD=mH25 z>wXqyZbI%&fnvVtR_5I?>$_SAVwrGg#d)XJrp_sA--kqZ!oN-!1xM2JXS8QObjd2+ zx1ZnM_91Muyrebu`6_;u-?&Gy|2!wUWuYRu9ayw&tDljeM$BsGZm%i4zhIfSCg{>P z473c3II^2c^X>`s5;9EXZgfDGt6CqFwVUBR@%kUA81=mxx?uXe$6Sk*FX;Wbox5Y` zeXNGeIQ3r*z>dXdw|R}v6Ns&U!@#I~q#O{1eRt|nnsmMxn6Qy7cFWBMp19g)wt9N@ zr=BH)WLoU2QtTIzYw@Jl%WCg5J;k$y2bDd! zz!Mk`d64~s^}9CO2rGZd9p!90ByKz?Z&^ycgD^U4x#(p3ym7HG9Ijr*u+`RC7b|;@ z>EN-!&_|Yza+soUO23z>QquBGqi9Y`~AJp?&$5#pj#V$OQ9^E*{7ye>h9 zHU3p0d4WWR%BH#6tv0MN)YY0I40C4>UO0i}omj5>2u!CT$8T&UO{iCPcI(4kck<$u zy27gjPFx?=w~F3ZKi0lvy-<$S-Ruc0l1{09O^4G!znEaT8c7FUdHZx-(;#SrC!eP; zn~}izpBr7n+IY4MmkD!nwN!lMX`DL3S-?^2O05naU4mfD@RcrOU;0J&`7!h%*Ox3+ z(KjNxmB_~G{Fns%0MH6>SS>ObKW#^-MG#6W5ws_pF4>2MYgi#QpJ~C7wYfiaP;%LB zKb>IGRcZOz)&A>~c{czbA7~eH#)?Dl3UUq zZ^|4rYv(W>-9JEBa2uCbu9W`moFxW1S zhrq?*awnYMnq=_O+CMT$hB#+L-i^DFToaJBXfNn!0grkAS7mJ)JgSP%%4=lD&`9FBeUxg}P1Qg7^ zspj+86)VYFogQL5drw>>_eF}7f1Rx^q^s!aa)P)>p|&bNd*Ea^1lu$q^8VGL zPl8RTyfC}6LyQg`ISzSN%cq&1jSe2hV-cv=ki(1KwFt+L& zK`z#{7Q;Xfgo1D5xN8L9Lyeeae6l=fza!zyKWo5bWOPg|LFC>0hql_Eyr~!X!q}#UGY?(fl8%fODQ1WoG&vx~gni+&jzH2nb*{0`*<9L? z=b|(Zt-eD#W4}@25NYgcv}J*tHuFuAegBV2`aX)luPK()0#i$NA?SBAyBvhx2u@E| zY`H)EmiZ))y+a>UWxO(yo3JDd%Ky@eU1z6sT?tKkv@zK-G@zkIME9umUP(J_-pZ@cC&hmD#OBYp7oU13=K0}9@gFqnEUE$KG~pxapUpH2s9^0JGMNu^pR^U zk>oPYk&N->+Y9Z2E;;T@T3f`-XeH+@R`|0RYL1B;nCHwqEBdgd#OmISPoPfQU&@AV@Ev2qu&S&?5>*igalL3Wh2~ zN@yW)l-{KzA%O&?LlTgZP(ryIx#zy?d*l6kW4s^l{Yoo%lg)ubFP`V?luaC zn2!^j2N7>i%(EMn24#?tYN8A#-^x#?-qKFz*bz&9_iUB*$@&e3{h8?1U#RVGn0}`J zgkqVGMypLp(cSd-?&GOK9uK={H1|PyOhY7)c>hZ9(o100-^1d&-4BEpkq5wpW5lB6 zQ2w@8H0ue`@9-y3qItv2SRY6S=ziHmqcXU24Sn#ol*Aof6=oY#Z>W`qR6=ShE(J~5x>9dQQ#RW{j#xU2`wWA?3xxFEv*{eZTY8Pdd|Z;wMbYbyKDrxmPX^JEGnTroKPf3S+L*PlDE;dcq1+I79Wyu^ZZd7LFeO)=3mTq| z3$6w+Se%6}fOrj-0XR=H!eg=jQjECmTW+09)blPwr%-r>UlpeG5a<_XZ>KJ|z%xE| ztV;Y+^E`&>36P{Xz`7RTx|ExNS9wj%?XNYxUWJ4^Q~ipD77rqV`nWBv<{JMF zmYg*)(WYp2ulVb+ zJ!Ec(!fediLPz)=(_B}P6=QCtXi3Jz7|FE(J|n97&-l6dx;6EdG|BvYV8gM@#9Cf&}S#h=4zPt%K43D zTeP(YJFoy~bGzm8KCAf~`cT;|%2Nq_AGB$F;{}`IwvL|KwS`>Q4Y?mcg*m%%GNSz( zd=2rRRq9aM{g)mU2fFNzT#&mm zXeiPUKsG3?f(W0*4o(CZXvZ4YfSn*DP|}steV|KM@oc?Wr?2o_y;N>S^*$4uZ=ZE6 zUnc7jYNA?u<^<tjiH#&57b@cye!=Sn;0i^)Iyg%l`n;XtxJNoq6&-r?Hi%x_Xsb zQ^S*1WDE%f7M|zODxIA24bIX>+;y}4e;V4>Oco+!vFPjK^>A=hXJGqs)O^$_7>Zlz zj^WFGGT$cKc?jeB`mJ?zcM9ggCtt{15KOXF$xGAH3P=3c8ME0aoAn}a*@oDiFG4Ay zg=wLdcDNjN|4psBmpOG;uh>@z=@TfU4O3Bj5|;9#@ZKn}wld43onEBU6>;Il9eR1L zNRLI=g(n#Zd`~MbUC(6Nbei|bx!Si|;7Ard;C|<0&6B*VB5?x=Wd4i^p6||LSJcQS zP<~%P!fWDm(qu?tA&G|=gu{w3G{=j&D3nQk>56H5S3(mv3>ME?0)z^mhgeG9T;U`N z1Eye^D8*KKViVklkll)|0Jn<4XwtS<6t>VJN=tGIyg?XE!t(G=V{2`Sg4{_4r=y|N z{X5=1ovnm7(y+7)C(%k;kC8hNE zkiV^%Za{Z9YG+1aZkwm6t9zL2tNUML9Per8jyI32mY-R)U-0r|Q}Yfd3gn&YDXES3 z?DKG5aXvti14aLC^EiWeBf}dl1hr+461f3yIM#7}aDxpD3oo=qR3^R6{!?87C`24S z4EAj=VK&6A^D{KudP(Wj7C58B=0RJZDKp?xNoyZc+IC#mY=}Vx(U1>K9^BOy1V^R| zJ6hb@{=m2S9*%U$APqA9$!bC6hos5=1t+EEDZq zql&MT5IXo7=03%EQS1bQEg0=!wadrOusQrp?&)+yC){Sy&LU5LI%DdTqVUcq^`BtS z5tpXZPTc6}!?>b&&G*#-%;5n>Np6mGyBPtS%lNDB<4w$d1C53>_39{=*$YITW?uOn zxk8(fBzx{eC&bBMO;k$t*n>PpyNr)=!3Ok;yGn0w-Jq2Zv-X($Q@yTtQtPYOvt}%O zz#%sJN=g%e76DZ%YUWP+#{)_iR=?X5`08{b#+y6bVzFeq_Yv1mOl4G9k|T`-`g*wb z{SlhAPG;Gvg2N-8KRVaXxn4c6k!7=6&{vBph|!c;a}hzyJL-S#1D*3!-X!3r^l0$V z%(cT4R>UaY`-?Tm%U*#A<_VwTC)}yeUA0`oi8|OZNVr0A<5!5osLE6_bh5*|QOTK6 z^CD%7uiRvh&$v(X@4*?WUoz@bUahLY6Vp)&yNJHuI^dP&Wgl_80VSR#(d)1|egFHD z%-En6DZL|NoJOw|rweSm&H+EsiM9TNZWdY1m0IFcAnrW~Ag-5VRr|LJr4<}$9gAfEMlO4J@{5}u=eV}|8s$$cZyZ4n6#=1?8A&(7~m$-}Q-kCh1xVJjhS#OX50rMHA3idM($!VRxK-nt7x1BINA z;SfwSPuj=^r6v6oL;q88O(h_;Np(4oTa=&JS6rRuXsjVns-L%mHKcYc1#smFV!%U6-;~+RWGz@IUD?OYC4V^I$_?N8i9{j zVKDcFlRMR7xzWVpq~)?D@k+S;#Vg0DDVGP9o@5(69!ZMSloi`??r*j`pH2GFFm>J} zzIf0U*Qm5etO~db=t027*5n&QA4jWZVMe*J&W9sx@dWPb6vgP?j=2VkX}kBrI6RX} zOeG#U3cJ>Ey!WMLzL`Dz>hG>HB`F3cDzpgzE>mfkI+MXOxN;O+2n3#6M#AS_o;VwO zUb2J2diM5fpv7QLdaNSFyKHrrZR~k97^zhP<4b^&ab@pW65P8(z1%sWgh~_aKD$Y- zFjaT@+C)IzectIUjRCL(180sZnlhB+6r9jke84q07mV<#_TbRM9b1L#A&bj$b_V{}dlVYQ^-R;K=N;DLPRsCOhU{6CMTs3cID;v5N76~A5 zMdq-j_VcYt9Z-{sN_zgb&lhpygvs|n;^FPvC{Ql?Cd{CA#mSnlr^=J9@RxJD z`KUs1=1W87VodW$J-+LyO5EH%inzQ8=X!G>;wknbzO?s4-fJJP_k_DsdArl2MYp{h(Wgv{(`G- z>Gkc$Ub|+tm<@$3sSs;$S~tsPg;NGeZ8zc#GP32=3-A5LcSCT$c0 zx{s<`v;Ad(?Nm=nMfS*m-Xj&O(8yHirBKTVk_u;;;N*S z%qBa%iJ2_k)?g%GV^tccS+%$|`Lu#Rl(5r{_D;zxGbT!y@rarN<}&7$9cgqM9mGzPoJ z-Po62dTYp1_b?!^q{9&x_Ie$+-a#n81Pz5|-Kw%0`KqxH=Q()03_*h94aWDr-x8h8 zB=}CF>;v9PcC*U!Jh`RZhu{svi0D@iWvMVWO4`zbTAkZZ9jEif)S-5k6~`~6TM+!6 z`yHc#Dc7VnU*pDYD>ufeD$0( zg^M45NhIrS27W3$4#gMR%xZ7#Of=TehB1ihaj zy&5rHQIn`~XF#3F#|dt>eW%6P&$4)XZCI%cmdS+Ptx9Xa(t4kD zDa2k4A6MLa$}=;_R4%cuSNjIPck~wdq^t@&b^W3`=!ZNcB|N3nbenZjT@tO4naV{U zIJg(X-uLrQC9Wndk3&@39~&p0gmL1CZuI+MhNGp}G-#@{kVM~7NzrwU1tl1FjsQU` zf6pb3^t5E|%}|$Yn-SPj0wdA1=gHEUoU!L_!P&*8hDGK_Wvq&tbiwiP!(6p|8rPPFCs6uMzA8WW&iTs6Zi}~I?l}Vrd8V7&eM-F9 zi+7h9{-BBq2YmxGEafhWdxX#tgfHK2|3bbV?y1^f3;}QVWp7P;Y06Lj!S{`|4FD)w zhi`yd1dC7d;iTY5%>v1o;EU|hh!9@$NG+eh=)g+wtJqfI9CF!%AdkHY=c>OEOmP>! zo@o0Fk5^g@Iz}Q)b`De-(VxtxmUYwR`+fDL)E(pfX|}Rmf%2G=HNkkmfj;gYlk^KHWIH$W^x4`YS>0tN1&L}U1 zdTRQ}mMRHy^%4#4QSR@xs)AWsNgM*OH z`45MbAvMaU$kG091M;Br!7Q{A0a}%qZ9H$ly^PK$^9vj^Xu6d1g>OsIrkj-|{U8as zUZ6)*U!0u(*6tm6D%Xduz4trNu`*_dE4zEU>hT=c_2o6{F96%4-?*L~v})#Vti;bW z=5Gk^T3@T7;;BME8L3~PcX5`);A5)sQGvu(fm^?TUnhcyy&`dD#=W)!hu-`;hB$Ys zEn}ia8Ah4g{hzn&Fx`p~|1T%`AM14cUsBUN4NZoC)U*JPr{jRf6ZEGXNjU^?Y(h8z zIYmtaJNJ0XyKUrq;ZL;z1N=>)2UGXL#b@~5o#CG?hrA#mhJcY&PF>CWnk~T-?B`bV z-NJ!dp@-X{n`Tl6q-Xh8o^)Bw0WhBlGH8cstwFZjQp^dYJ78pG3>aA@SvRd^rPq$E z*?gi)tLbh3(Cx}65;%9TMv^G|TNG5GSBvKv@mYEEN3z#na!Uk9v->&n^M}5qL-U&k z+Xq7hq5wJ|Pfg+A87aU|>z&PyO{2H(bHU<`Qb6mV*q89nX#uh;v~3?p7a#2m2JE}U z0sF4yGQhs;_sccA)fk5Rzf>PW?_Xb-m#sOXdFXh}+DdEZnT;;J{nx2f+=*TP_w3M~ zdH&egdGD3l{iC=`cwqVxNL^E;trgNv&BoIX_}C_YMNUatPEJ~0{=U4tnu3y=oC@g5 o6}2l@x*&=(zZ~G|ZtG<4``;h%?zb?L%?o@>*HEY6`lILn0CJE-q5uE@ literal 10589 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 diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index c372e50d..70f575c7 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -1,8 +1,10 @@ Singleton providers ------------------- -``di.Singleton`` provider creates new instance of specified class on first call -and returns same instance on every next call. +.. module:: dependency_injector.providers + +:py:class:`Singleton` provider creates new instance of specified class on +first call and returns same instance on every next call. Example: @@ -16,9 +18,9 @@ Example: Singleton providers and injections ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``di.Singleton`` providers use ``di.Factory`` providers for first creation of -specified class instance, so, all of the rules about injections are the same, -as for ``di.Factory`` providers. +:py:class:`Singleton` providers use :py:class:`Factory` providers for first +creation of specified class instance, so, all of the rules about injections +are the same, as for :py:class:`Factory` providers. .. image:: /images/providers/singleton_internals.png :width: 80% @@ -26,29 +28,29 @@ as for ``di.Factory`` providers. .. note:: - Due that ``di.Singleton`` provider creates specified class instance only on - the first call, all injections are done once, during the first call, also. - Every next call, while instance has been already created and memorized, no - injections are done, ``di.Singleton`` provider just returns memorized - earlier instance. + Due that :py:class:`Singleton` provider creates specified class instance + only on the first call, all injections are done once, during the first + call, also. Every next call, while instance has been already created + and memorized, no injections are done, :py:class:`Singleton` provider just + returns memorized earlier instance. This may cause some problems, for example, in case of trying to bind - ``di.Factory`` provider with ``di.Singleton`` provider (provided by - dependent ``di.Factory`` instance will be injected only once, during the - first call). Be aware that such behaviour was made with opened eyes and is - not a bug. + :py:class:`Factory` provider with :py:class:`Singleton` provider (provided + by dependent :py:class:`Factory` instance will be injected only once, + during the first call). Be aware that such behaviour was made with opened + eyes and is not a bug. - By the way, in such case, ``di.Delegate`` provider can be useful. It makes - possible to inject providers *as is*. Please check out full example in - *Providers delegation* section. + By the way, in such case, :py:class:`Delegate` provider can be useful. It + makes possible to inject providers *as is*. Please check out full example + in *Providers delegation* section. Singleton providers resetting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Created and memorized by ``di.Singleton`` instance can be reset. Reset of -``di.Singleton``'s memorized instance is done by clearing reference to it. -Further lifecycle of memorized instance is out of ``di.Singleton`` provider's -control. +Created and memorized by :py:class:`Singleton` instance can be reset. Reset of +:py:class:`Singleton`'s memorized instance is done by clearing reference to +it. Further lifecycle of memorized instance is out of :py:class:`Singleton` +provider's control. Example: @@ -58,13 +60,13 @@ Example: Singleton providers delegation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``di.Singleton`` provider could be delegated to any other provider via any -kind of injection. Delegation of ``di.Singleton`` providers is the same as -``di.Factory`` providers delegation, please follow -*Factory providers delegation* section for example. +:py:class:`Singleton` provider could be delegated to any other provider via +any kind of injection. Delegation of :py:class:`Singleton` providers is the +same as :py:class:`Factory` providers delegation, please follow *Factory +providers delegation* section for example. -``di.Singleton`` delegate could be created obviously using -``di.Delegate(di.Singleton())`` or by calling ``di.Singleton.delegate()`` +:py:class:`Singleton` delegate could be created obviously using +``Delegate(Singleton(...))`` or by calling ``Singleton(...).delegate()`` method. Example: diff --git a/examples/providers/singleton.py b/examples/providers/singleton.py index 963d6c14..73b736ec 100644 --- a/examples/providers/singleton.py +++ b/examples/providers/singleton.py @@ -1,6 +1,6 @@ -"""`di.Singleton` providers example.""" +"""`Singleton` providers example.""" -import dependency_injector as di +from dependency_injector import providers class UserService(object): @@ -8,7 +8,7 @@ class UserService(object): # Singleton provider creates new instance of specified class on first call and # returns same instance on every next call. -users_service_provider = di.Singleton(UserService) +users_service_provider = providers.Singleton(UserService) # Retrieving several UserService objects: user_service1 = users_service_provider() diff --git a/examples/providers/singleton_delegation.py b/examples/providers/singleton_delegation.py index ebc9aa2e..f2342ad2 100644 --- a/examples/providers/singleton_delegation.py +++ b/examples/providers/singleton_delegation.py @@ -1,12 +1,12 @@ -"""`di.Singleton` providers delegation example.""" +"""`Singleton` providers delegation example.""" -import dependency_injector as di +from dependency_injector import providers # Some singleton provider and few delegates of it: -singleton_provider = di.Singleton(object) +singleton_provider = providers.Singleton(object) singleton_provider_delegate1 = singleton_provider.delegate() -singleton_provider_delegate2 = di.Delegate(singleton_provider) +singleton_provider_delegate2 = providers.Delegate(singleton_provider) # Making some asserts: assert singleton_provider_delegate1() is singleton_provider diff --git a/examples/providers/singleton_reseting.py b/examples/providers/singleton_reseting.py index cdc9e078..19c9b238 100644 --- a/examples/providers/singleton_reseting.py +++ b/examples/providers/singleton_reseting.py @@ -1,13 +1,13 @@ -"""`di.Singleton` providers resetting example.""" +"""`Singleton` providers resetting example.""" -import dependency_injector as di +from dependency_injector import providers class UserService(object): """Example class UserService.""" # Users service singleton provider: -users_service_provider = di.Singleton(UserService) +users_service_provider = providers.Singleton(UserService) # Retrieving several UserService objects: user_service1 = users_service_provider()