From 91f54159879c83a236470ca45d696115bb9a028c Mon Sep 17 00:00:00 2001 From: Ismailov_Rovshan Date: Sat, 17 Jun 2023 00:29:22 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=B0=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RenovationWorkContracts.dll | Bin 0 -> 30720 bytes .../RenovationWorkDataModels.dll | Bin 0 -> 6144 bytes .../RenovationWorkDatabaseImplement.dll | Bin 0 -> 85504 bytes .../RenovationWorkFileImplement.dll | Bin 0 -> 39936 bytes .../RenovationWorkListImplement.dll | Bin 0 -> 25600 bytes .../BusinessLogic/BackUpLogic.cs | 103 ++++++++++++++++++ .../Attributes/ColumnAttribute.cs | 31 ++++++ .../Attributes/GridViewAutoSize.cs | 27 +++++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 +++ .../BindingModels/MessageInfoBindingModel.cs | 2 + .../BusinessLogicsContracts/IBackUpLogic.cs | 14 +++ .../DI/DependencyManager.cs | 66 +++++++++++ .../DI/IDependencyContainer.cs | 40 +++++++ .../DI/IImplementationExtension.cs | 17 +++ .../DI/ServiceDependencyContainer.cs | 62 +++++++++++ .../DI/ServiceProviderLoader.cs | 55 ++++++++++ .../RenovationWorkContracts.csproj | 4 + .../StorageContracts/IBackUpInfo.cs | 15 +++ .../ViewModels/ClientViewModel.cs | 10 +- .../ViewModels/ComponentViewModel.cs | 11 +- .../ViewModels/ImplementerViewModel.cs | 12 +- .../ViewModels/MessageInfoModel.cs | 20 +++- .../ViewModels/OrderViewModel.cs | 48 ++++---- .../ViewModels/RepairViewModel.cs | 18 ++- .../Models/IMessageInfoModel.cs | 2 +- .../DatabaseImplementationExtension.cs | 27 +++++ .../Implements/BackUpInfo.cs | 32 ++++++ .../Model/MessageInfo.cs | 2 + .../RenovationWorkDatabaseImplement.csproj | 4 + .../FileImplementationExtension.cs | 27 +++++ .../Implements/BackUpInfo.cs | 35 ++++++ .../Models/MessageInfo.cs | 2 + .../RenovationWorkFileImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 22 ++++ .../ListImplementationExtension.cs | 27 +++++ .../Models/MessageInfo.cs | 2 + .../RenovationWorkListImplement.csproj | 4 + .../DataGridViewExtension.cs | 51 +++++++++ .../RenovationWorkView/FormClients.cs | 8 +- .../RenovationWorkView/FormComponents.cs | 5 +- .../RenovationWorkView/FormImplementers.cs | 6 +- .../RenovationWorkView/FormMain.Designer.cs | 12 +- RenovationWork/RenovationWorkView/FormMain.cs | 51 +++++++-- .../RenovationWorkView/FormRepair.cs | 5 +- .../RenovationWorkView/FormRepairs.cs | 5 +- RenovationWork/RenovationWorkView/Program.cs | 95 +++++++--------- 46 files changed, 866 insertions(+), 130 deletions(-) create mode 100644 RenovationWork/ImplementationExtensions/RenovationWorkContracts.dll create mode 100644 RenovationWork/ImplementationExtensions/RenovationWorkDataModels.dll create mode 100644 RenovationWork/ImplementationExtensions/RenovationWorkDatabaseImplement.dll create mode 100644 RenovationWork/ImplementationExtensions/RenovationWorkFileImplement.dll create mode 100644 RenovationWork/ImplementationExtensions/RenovationWorkListImplement.dll create mode 100644 RenovationWork/RenovationWorkBusinessLogic/BusinessLogic/BackUpLogic.cs create mode 100644 RenovationWork/RenovationWorkContracts/Attributes/ColumnAttribute.cs create mode 100644 RenovationWork/RenovationWorkContracts/Attributes/GridViewAutoSize.cs create mode 100644 RenovationWork/RenovationWorkContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 RenovationWork/RenovationWorkContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 RenovationWork/RenovationWorkContracts/DI/DependencyManager.cs create mode 100644 RenovationWork/RenovationWorkContracts/DI/IDependencyContainer.cs create mode 100644 RenovationWork/RenovationWorkContracts/DI/IImplementationExtension.cs create mode 100644 RenovationWork/RenovationWorkContracts/DI/ServiceDependencyContainer.cs create mode 100644 RenovationWork/RenovationWorkContracts/DI/ServiceProviderLoader.cs create mode 100644 RenovationWork/RenovationWorkContracts/StorageContracts/IBackUpInfo.cs create mode 100644 RenovationWork/RenovationWorkDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 RenovationWork/RenovationWorkDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 RenovationWork/RenovationWorkFileImplement/FileImplementationExtension.cs create mode 100644 RenovationWork/RenovationWorkFileImplement/Implements/BackUpInfo.cs create mode 100644 RenovationWork/RenovationWorkListImplement/Implements/BackUpInfo.cs create mode 100644 RenovationWork/RenovationWorkListImplement/ListImplementationExtension.cs create mode 100644 RenovationWork/RenovationWorkView/DataGridViewExtension.cs diff --git a/RenovationWork/ImplementationExtensions/RenovationWorkContracts.dll b/RenovationWork/ImplementationExtensions/RenovationWorkContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..537d74d637e33f9c6a04ae04c4f5ffedac4cfadf GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/RenovationWork/ImplementationExtensions/RenovationWorkDatabaseImplement.dll b/RenovationWork/ImplementationExtensions/RenovationWorkDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..73ce218479f338b4a5c9b1cb42e4aaac21bc5a3f GIT binary patch literal 85504 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

ymYmeYD7om1QEcJ=wRioo zaUWTIzF+Tp*LJ+IzZZNU1wnTZBqE5Y1%FU+m54+nBCdi;oCKmpAgIJ2Al-3%K5u?} z=eyqZ+G+TUbF$x=dGqGYdv9jmyqTT(uG^=v&{6bU_&IPc&dp%mZN4#~lWe|cQDQ}H zLX4bEnBF=y9gjkrUNPV>N|UD6#yvP@Jv)Xz+x zfkm2M3Km*B?S_GHY~f4==8&;yX|eM^{uk-`^&P zCtbhED`b8a3xjSqjEmiF0^4|*iiT%XaF51~C6Bxv0nW&Z%DUsJ(T$M`3=;LR*5Bbd z_$rp_dLs1*TKiL1GV^6kw=pVp@vY7CwHFtr9TA(PhpdSb>NJGqX{GtmgIyaPooVAz zvM5I}Dm3p6CcVYw0JRX6Th?jkTi2?mVqL3^ueA!vHg>WY5_ax3RN`di$pX*Lx;FO( z_JEXJPoSbL6BUJ;xSr+IQTYZ$D4PjZ7touwY66=gQ%eYzU?$FAqOnRc~XEN z3E3=kNKDm;hzj9RoSQx}eSS$f)2F8NPKMbCl}TJ2dL4t4tRtjIr$#7Bgb+;gboFB& zT#9;0luxEuf@6Ra0pqcsZnpjWFEHVCV~+u?ar%O&({7Kz8@`}knprvn7vchBkI!Ft z6KOT8D$|LOVjEkROk_#`u=y}Lhwn_~kc;4h&-q2H=*$F#?^LtW(8-wxgf zcmbb_N|pY$b_Fkh)B;G(;8?WJfKPT=Dz+7pFjl_Chh8f4#=OKIC z-MpGhe^$HdwT&_jGS!)=Rh4DsC1K$;oY_5(4oEs$D8D&ur+OZWniR3WE)B-6Gb3Zd zb_#Ye+uLty0S<#GWu3$|0DMv8NgEHYSd)If)#HR{`IInM*@vtcwoeZOi`32u_64VT zD*{K$tN7`@Y4o?aFWZsv41_s_iv(62js_!6d8HNSh6@|~Hv&Sm0tdj%JgTDB&KTI2 zaoc3$l*UnNQ7G-h+3d$uA5LL!ro2`RPs^~&O@kwvnmJHC2Z(Jy+Y2hOH&@q-Qo|ys zYuk80EGG4E8ZxjOY>r-K-(5>jWk`1lN9oVw2Zq;L>7r7tM^U%#JV$&nt;eQn zc^s$xd+_O3>Hy2mdM(eMiC+T(E_5%-G-IgK_vgBg;gH`;gBTB&Z- zLoUey-yT#sr>d9kCjGeG)mQH(UDC2WLA~~WMY)Q0+Wjd$v%!ysfy)GDOmds;r_-+Omp#QO46!IJ6*f1UjxhfX(@GATg{hR?OfY8 zsXwW8NA)~t^U-SBtd1>|MyqM8IzHvEo+Ff|?q)BmUXN-|PSlY1uGX5QK8k+(b&P-2 zZ~->y2*%TC*sIsY79EEznuR69nG}5JZ!dcGY6AUTr`hXKx{3Y&JfLd#DNy9}PIt8c znu`dhV8@&#+&M0NcEv?0;{3G$8s7knmal-P&Mn{`qFx24yr$-l2-Trs zeqRRd2iHQY^6;YWF@EW4c-7__J^Csws^1UmQ}r>bj>w&Bxv>tJYGNLBr&<`(F16~g zj+wvMP&+MjZC_NaY+<`}Q5n6wQ7!QzL3Q|iy882Lc~h-ErfnPF5}<8RE_Oe)53O2a z*Il(&dLgRSFQM+!ZM#+y_FK@$@0+tP`AaC~n3{Ih_Ni5u^~$RG=IY++bk)6@pX7L> zoJolEj3(>wsvWjPDjjImQO*5UTa%77m(Ts9&3hJGe*T&Fr?$QQ(Qo|ScU7to1lfjy z3et$Qw==)s4f#|)oo_^) z4fv$+N#oPFjrCU|nOYi5m@;A7gpF;P3aVkgAWRKMN{Eg_=xC9P%e|ez}?HJ{Cc`4 z41zGz97g3wq6G=}MN1MMh|Wv+T=WZB<{yqqC5gNkmA)xCd!pF}yjK;i5pGot(PT84 zLsNDHQTYP9Lo}Jrgkdy*{A}2mYwU>52GNMX1_5hLWrAps9jR4kjZ4-L!9x-q&K6Wh zd+FUEn=YvK(t9l`#FPKa7unMg6TA`0zTRxG0d7LBE~)XZw^#r&BXHFbl|Br!K=~+) zO66=8=^uvCI4TN*&h2d`>GJoqH8e<(UBNDtEnmhfwgqRG+66_UEFxj9xd9|xp-cv} zza5RWgRf+D_ec>Se&+EIjsHv=86$DfOxBTa4%eW!wLwVel&lDLsyT?pBTAaAt~=8l zm3~#!KOT)mrQ4+SF>%Kc`NZd;^lOknaSXSYf2B!5fZK@Y2r93%mwz2i5S8DH%2%TD zyUZ@X--&$5zS>^?o|k=9;(sWpSK8YGN_HK*0?-Aj&CObG(RjE^XRc~NOmJOi?^57S zw@tW1<7wUd>Iu<*UWPc$B06$lRirO`j9A9VnkvAwY^~4?dI!dgY66b#2~TA@sx_nFJ{8(Wk^g+k4)w!x4zF(g0?9Tp1v5X|8kxYj_q ziPjU)Ry0O?W%vL99W1j0kJ@No>Iu?1q4s^i&^R^i&`1-U3FNDCJ}734iV7Pw>CBVEf1q0gF@r zlt_JsRDayqog8jeM{Fg0zo-`vj^K?K>t^F`9DOimtpK~ZG1e^JQ$CBEFTS6wZoXJE zCQ@jWGhI_pfZ6V4#9%66mou5D{4nN|&-uyXgBj~{xC4MT78HRn@p$GiSuqR$w`Lln z(w{{A(Ew+{XxW+H0WrS=dNLX4$bj4jQNQWqoCuf0Q0(@rN1y@G3lX|E^o254MwHQblw=IL9cWwWkPTh>4&c;LUu9!rpK@ikAKh_@&!g!B<_i!$4=X z45iwu$!f1kT|YwEVd#~_x5Fi(0k7;b#v>YLfiio@h}QI~<7Py-8PUob>Et-dddgZQ zd$i2$rR%PzjznYZi3mKOQZY-+;*aI|vZ!IN z5t*5o`{`>2&9ED#x4~WM_COC@S~EdxY8t28&`KY*#dsHamFvXZp2MfLb3NCx2`}&0 z%h)tlfu-B`8^f?(naX++$*yx}>Dwj;*Zs*>9 zoNQ(1z_s*nZG5Q-o&&cd5Xo|($VgsAvb>Z`i-TpW#Wx^bDuUD|^rgRWdw!uCt>RR{CjW=E-Yt);COSpMoa%-W{V>zE5bWCraR_7Cj`OO#2 zUVHlFFSg%qelq*L8y5y1{^a*x$-expw{Jgs=*Pd)(Abp@8`BwW$p=k1Y{D@U4w-P= zgd-*#2phAE!gU)78(U43ShCJaHNxKUalJ`HkZfp-#_$=yXQ&ND6FXx74yNETy#;)| z50h=TF_6@|CP3;($>e?(OWow-ojs<&`WqMz0xRAUsJ;F0oJZ}>t>ae`wcR-#U$)wI zGAUbayhl9Q>RY`>6Ef7tXA|o6Je%dW{L1PZhGb>+@ma-h@AKr@_y~VIA=k#svC7{) z;8nT#artzj>dluY3*Y7A8Xtdzf$=&byRBlp(RTy1uxn`CPgo1}x>Q|E5! zpaaP^J3+$^G-k2J9B9abh8$?zg2o+a#DYc~XuyJWgoa7yF^1nm5 zj1Eb3i0D{r+|V>`NU2p$>|^khOE)$6rhso{;V=u7Bnl%IDcR?+`liPa4BgM|{>4}FLn-g1by&>f|?7b)Gu3pV+M zVKy3Xg-~|7h{p4fir+o>TjIdOH!!;?d~M^8-Rk?LE7$S(50cECTXj@399MJabVQok z<~}J+ZM=smO?~?ga(iR0>*MQw+9lNM8}uag`uM$MdgI0$Na1VW4UxI8cRKdFKGA(_z3xE;3LIHnvceYhg3HEkg>WpGHfGbHZo)*<2Ev4BLg6j zlLQ9c2#7|@fV5i3cp4CF=kd8hptyQS!nqURRf%73Hd%B5flJ<_0X~KVYqgzBCcHm^ z-y+H&e!?`%*#(^EXgwxdMpS{-V0x?jHWra7kcN zBoCM$LwOcks`(Nl#3 zg*Qe|UEEu6H%}-4p$UK>6qhu-xOA~_k;12VU#@M?y(Y52^i!p4fhv6`NnPJ=(bd_w z(8N_1O%xFTaLblS1Wd@w&m=7|fOxe+U(_WyPMIusPs!#wz`7j26sRYw@oQC~Ic5s= z$c<#um&m$w7Xmd=jcye^m{%a^9H)BIG6^NEr}|mEUq4x)zQ}~v@sVSffEaSUnLvq9 zu1WpQJQ2;r*OjjHduZoxC#!S%miNVxR1#9Fp1pzWt|!1}!Y0eHOv zUfpeVmUjsd*SazKmzPM2^5cu;ED)zq!oTLjOh1imb2m+j>8oh~^12ft4A*7&fk1up zHIDCNVe7%!+4*lA#;YG@@CHl(nnvgF>Z2LFlu-d~3@?nXhxX+_?XP2xx~u0a{KU2D z?Ca@!tmm=5$NPGFp6Ktxg(m;)2MTW*?+}dszW(0+-acSV=(mf}% zQTvqI5vXmFy|3r7-huvJywX^|kj%^J9q8TP-_zI6%YnGMX003Tx3y?t9HpIWg^{<- ziC3KmIR0m^+2OU8DhgDq*DDEP32T;UA@TPwdrtnQ3J#CcVt#iz%RG?-L#d*Y#*ZVVK{$7|Ep7=Z ze+o6&zuSx#Y$_T4rH6+T{FqvYXJ-%N8lO5_oWeXiE$>m0GC$b^B9*F4Qu}EN8VE#5 z+i{~WsSX(>xM{H#PP`F(ezp{-cj!u(zjqq?5j(CXaQ^!^?qI!u7_X8Yk@Mh3a7y&3 zV6LYA{eQ%j;5d{&9X@SRDTLx}m^6c7d;(CNl+&iXhQ{kx=G-;%?pG{z47rnl7Lgy{ z2SNt^uBCniqL@~3BA55Vcn{IRYdXj%Jxw~k?ROBpgZJOg%KZRd e@vCgf%60^+@!u-}el0|)PdQwF`uG1%1OE$JbtNwV literal 0 HcmV?d00001 diff --git a/RenovationWork/ImplementationExtensions/RenovationWorkFileImplement.dll b/RenovationWork/ImplementationExtensions/RenovationWorkFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..068dd2beee0a2b085589c54f7a0efe63908ae44b GIT binary patch literal 39936 zcmeIbdwi7DwKu+=XJ($6%uFW9gQ7=Uty;kg-k{>G)>CP%msTwl^%QN@UhFyAitl%=y`N{ENzijX{hfc_ z-{+0ade&{Pwf5R;?`O|`W`;Rmzk)nOz_AoJ@?%_MczJyOZm?L6=N6M-4SM z2Kjo7>DeR*7$KV>2pH(5(hvlULYpB77!jKx2p9-UH4&t=!KC5nAwnvl%@}xZ*%2dX z)rBcD07aK&j^c-E$v^6CGwui5+=%ph(`dAI^9jIeMpquYc_NS_7V5*wpwNOfS(e11 zQ%l?q?$8cp>`hm4yA$)8+`OV){IEa?F%G!V$wAaD)PLmWtjbbuvs7_N=Oj>WBHc&fS8l>An3Y-KQR7*>{W z71YKt%+iX(Odrp!rslW8Dr#{Zp%qKmO>G>dDy_I1>65wDwER|&a;t&TiY0OMtd_%+ zRx&Wn+^R9Z)oyMzNLsNZjx^LVkXAA*32ud%@6N_!+-k72Vo4m;RvX7uv1k;=#-t@Y zE<88PconoTGa7*o;Rd6<$ClML#D_Zg2v2+%h~7L_(;H9;lG;=~H$5I8-oTjlmA=qX7{lzb47BU?w~ivyk)*Fa ziYylxV&X9xk1M8333=37>!I4?Opo-BgF?Z2Qry3|SOvlTi;J02?`Ot=s4?RspqPTC zAX39MXr(4-BF4l-O&r6-2~2Q3TeK0r`A;UEq+pP)wOmq^@yky~31+Ys2XCvX%q2uQ z%V4bqe?Tr7CYQaX`2%x_FykD8;!Ej{y3^#fIJk-HMx$IY8s%DXRT=70m5d;$A=IB@ z2m%HwQ!xbLnwpCKVY$e!spB)q0@oB)?I34V$_Pub48IUq4udI-w=N^(%S-EyW^1Lk zl}lOQI@0#jcO0c2P;Klky|=$Cj3jy*21k9sJB1aOI< zhOE>y;9MdobSs60Q3%w!mBM<*RiW0PHMn9yE=lt(L+WDSQR;#%=GTSOLFK`z3#W4? zPb@1KrFawkx$9uA9&sK>*NEdLqsCJZ3^48=iXjLXxHTw-AYfqCR}4YGz=EzAf^bco zh5q5zkzW(dnNtxPYGOJ<z3 z*@?G}G8<&07Jf*TF}rSN4=&uTFNAXQy7Bh1-mC5Sl+Q zmsK;)@hD?R0v5kPxr~}Taos|-(w(m>oGV$QT*Iznud)kO5LE6En;{4oSlU%73j)S4 zn;{4oF`FR>7}YjI5UxuPtwg@C3CgekC7H7jHtK&KI+R)n93zsN&%_y;z%|IjBa#J7 zU=W3XdXR@lh(%1miZdB_F8rd8Pnio(fvMf5hdUMN+=lHa(xZ+2kw8LEY5tc*>*|8NC)D=)!srSV3;Oh9k z{3fJhPG9ZJfidi2EP%RK=zgT{_%a3Eom|D`ZdJ;H?nwH9qga^2&U6makM>tc{~Wxs zIHJ@!2%70%_E(D<@pGVZtmV(Zo6eA#{^%&0W*m!iZN(9z)K}uGvp7?=g;qf2-U2}- zUJUwI?ZbGi;xbma`|*gxWkmQs<#G1gnNA3>EI@9hx`6Wz)G#v1j4sc zC?-+EY_d{mO`x=_R7Ml1CM(sg2^5f(>d^#h#!6xHYTqvhVf4eO33;0?YspZ1Epgrq zsp#_Wmrfz5Xx;a}yj6t*b_)mQD#VO)2Y3f~9^%n=)6UFLORRSd(Rm|A_S*b2fq#$JU~D6B{K{Y=>(pAor2) z!6&+$fA7CAlSNA`Pn*z|3rZH0%}k(%gt(9ijF}M74sM>2AI(#cWqKi~$+Beg%zW{l zoR}r?fe0{#(Xm%6zQ_HpPi(SB_&Jz5yf0s>bjaz?`_F2-2kBBz|1IwnSFh5;@)XjI z4jJR_o|@mEz1*LRq`NHHJS$)Plbo0(@j-pMD{C_n+;?w%E|v|>dtCAkg7eOEMGgY8 z97uD%r>EJI$~#LopO!D)mlLx@^3JmY_R6F{aEh>nyJ5z$s#vLuf%9^Ng~Uo-q6w@W zR_anspyI65x0o1(_)8lC^dnr0cs;4M_a;X>M_}{$>xna3%AK?Sc1FsKv*-Nxi!}pt z1EuH1>G@rL25mCmMu0V0mc$1m_xa~#H4u)vPVYE)&YGFaz}m!VqA?!0c#LH~+* z&d8JuTB+|qIrT39n=c2DDY+HM5$n5v8B8&_W(gk?>H|N^ieCv%cNoi!KJJtI2yT%u zjQ?N8N?^vXf==pc0C>3u7pw!}io)8lfr1-Ky}13Pt_8EMxWwy8T?ecz{;z+21SRvcJXb&)UeB)D5tKbv}M0t|5P2eSR3f$_v9jQx)qcB8Rq-o6xwf zSX;aq1j6NPc}u)?wfPob{c?-7P1*vRg9S-;pXRT9MRRYNbXoQQ`w?6j_xW`+;65)= zedY^J0MS!CZMg-0!YAG({a}G4gKt-o4ea7-$+R}IB#v2WaXh2_(yBHhmzok^>Q)$` zaBWg4rtH|Q605G+JzN;nH=N*yVo*1q0mD+%^MM?(umW3|?XXspWeIN>YU440FpjS! zRKB?&SRT`paK(`0{*o)3%?t7kzMM12lAOU{Em<(c?-wzNsDkZyT!vD&A&QCyPi5^G z7kBf*eDg@LmAPHwWeK00)>bY}-NE_r#E*qEXkiqQ>b$bGQg^b3HjF-?Y%M8UOUhPm zq0&d5vz0uCzZP4bO=rT5-B8by-$2xVo(v|xwUM<`akii5tKSsqJ5|S^oy;4~F>dgj zW9Fs&u(kOtU@~Y+fgG{kX8->tNni;dyw>uuajlbM5B0##K<>vuD03|?gC?d9Us9;P zVEk?X|&tzs-ffl3WNXld4`)h+z=Na7f31 z_d^^5Uve?j4bYr>I1IfiV55$?jPUTBps*J6(MbkEd&db4i@o#EWdgYNT=Wu_Xu{1w zYRqYyx)(0&8gsatzmea!18g4mJ#G)EKwmCjwk!(h2e7 z7eCJWn}8pz;w2d@#4`RU?7n_}-_H-P_i@`Sm!3cM06K*AzP}^A^7XA`Ibqu%(aSW`IDgX~-`4PwPWBA}lT+Tg*V{o+msRvaI!ok8}k)IDKG1~U(tNiVP zKP+G+nU5jlnoqJnYa?G$J7L4FF4R?>+XLeGQ(heQO-FfIp-sTPnl_`$HRmClqv}=e zJ$)_z`7103Md7bB5syzoCQ&#G6*3wy#aDYO*Zhhf1~l2ntWN$?x2!urP9s zI5BQMC*R6vIV&v5S#fH_q$!9MGaoe)UnJ4ykE&zaO6@^7wm00Nd1Y07N8$F(HdaSu zoA(+pN|*>G8PiZ}0&Ys2YrdrR!lb<>UD+>k z3wb?}jwoOLT(Q9i&u#XF8C#MGXr5ya+{p!+h=(J#JT6g7@i9M7k7 z`&ss;-D@AK{{k!=$d18VqF*xVL*1mXUcxw*5g3{ir@aiq631%fzm9(n3DgV7!N>Jg9Jd0#EV{HOcidToGhRCaQD2UgdfM zClIZ9Z7AhjzY4E$aP!BN_iEgNPu_T3rCBNCem)0MYe?Ufir$cE?+%g1=M1qV zXUMt7sC~#dwuASZPKc@Bz`MP6INZ(W<(n^I^KVL=EaAuEymq_=4%Uv17{$K(5XY32 zdYiS}<8H~g=j}trbB+hV3$Gin$LmJU#1U&C2k_JofS;DxpX&1P z=Z36NL*)!ou9%~8MeWITroL)E-&L3&zd&EHvA8}OXoI-jC(YU1QnSzs9nL8)J2gb03?|(9`bC3vg<7^%)KUi2ca7%Q( z#j`G84Kba0hjZcBTOgkhvrMJH={sT|z3&3azL%%@kSFyYV5EKzP=|pP;xLGc8(v1$ z4wmD``1@dBVSov&-&S^h-Uy-9NN~9<>?<$3dC@S#+_;Flf>PmVoLJF!llQfR+A8tL zif!i3`}m~y18D)|Mj*>a{nV3+i8&OFR}QgKe}JHFfG35w4R9m;o52!3$NkNtH^~Lz zC@gVo{t*Up3dpGH!X>9`>+q!(VmLhLiFcP!2R(*1J>0m&5&;V40s%nqwUw~qRrkXnj6oB z8@&a~ua|Qqe2L;YZ74tdKCPW$!bq#Gr@03$XxnE3C~3wetAX+LjV9`V_eZ=m z+E-X~4FVi7!*q6hd5-$71F~Ox4bjLBj@JRWL*pFZUI&Epy6&^R4k%A~qWpC9T?a5D zlmln`)_+DQqZ>IBn^c}oS$NthhW=(u7&WnOe0@XxxQ20KCV{}yO_Vb28%s1CDQUn4 zp`#M`!tQi?*D55G=q8l>dJlMu7gE_=^*yBFr!H>B@<1a%PcDM&l#bL2R>q%+?fIFN zw-ppbKzwG5-2d!_&hIyUH1U5_%5O%V0T3Uhj22@V%!NN9gC}(@UbXwm9mmpiI$sqZRak zZ+|pO+avD-zF#zUJ`>I&;j9zRPT`yajzu4M*jG#F)Z!@37U>ltJ+pji zX_VT8bBAzNLO)1XN+dmqBud{E=?jorbdm5UA{$YvEvYQC=!dXr(PtIh_Y+E9fIbB) z%c3;6s2G-u1RpKTe=hhz;PdD{3|Ex?B%A`Yvgp^6w`6d%FG3S5 zrk6zMoFK#RmP|+9{^q&PH;Af(ixAHRB~j>Cbo zRmemm?i4?AQBCwXdC>PWk%C5iQ{!1hVdggC`S|mq`8%QJ;!GfCWj?(mnzx}RjW}uh zg;1{wwU}NJ>R3#;Mtr;Gb)g1{hcoHdE-Op%_Mg40cFX9XtKHdjNT_$k$~Wm0_Z(EGy|RE-S0(6PK0M^q(#(Yv}JTD;@N?OS6-{aA~H< zG;)1dOJ1Q=)M+XZO7%TMAtM)cHx-Huiy^YK9w#I@D;uaxC>8bjRN=C+kp>vY($eVX z{$r^mVgyR);sS4=nhpi`8P#;Vz-I)$BJcr$-vcygY#@MRywd~4fPeQ706gT60lwgm z0}c!{08X}8bF-h}Zo$vAP6S`UCgJ~k;AC*BM5=T?5S<_RbDC>Jy3Lvb&5*SEEHD%J zg#otwj=)Q$)o~(yIKXYM^|R$wfztt3_*wt^f%$;S`!-i3s?{qN>z^L@I$*rK6?u42 zva!c51#j@B2f4EpIf z-m1{0^bzj9ep;@nFL1B))4yu!ZlQjzsb10aAEVm6Dzd4X8jsz9pVkZ2D;e}t*$CFW zk~aF*z~6dJUF^FMA4PgnsP_tHSKeS0(LO~PpCR)_bZm`y5GzG=yio5Iob9^>nkNX= z8(8BjhUPRaD=oeSEBY)g8&X`1``#H^HlW}ZqlC`VvYLWo?B!Ny*)HD=MwHIcvd8hL zBTC&uT}K~=t_haX&m8K;U^%TmR`vbm&~3p=x=T@kH;V2G4xo25^?dnH@rjBx$L0Dk zfUXtly#n?(fNmD5H^BY|(4AT~CUlE2kbb0PO`&3Zp5kFGySL&cV-P(h)TM!kDqaQk zyigqHy}`j$7H5AH9w5LCDeNb zCm`3u=zB^QI1RZTM&H*m&S#9aX&L7;Mt5u3)`A;wKX^dPwxRy3X}6Z$QGA1O4E;pQ z9xgWM7Js z?$H$YFHVc=L{n-hPTfMiSMW6Y7pDt^>J98i|KfCsmVN5`z!*tewal_2=196u%RUL- zVvM3&w9Jb!8b$x6WyO_$HEQWTEvv2^VAj$jTGms3i%~~=w5+$h82h#twCv4_Ta3}P zU(4RDD8}=aH-+Nf9thUc{L$P8rhXr6poV(s5qkSka4cP+Demo9nteRWRGp2bg+i(I zY%E=^sK9TL>#=mBP`!aaAlGAQhnAJ12FKAoT6PTjH;#5`*^-JIjPdk@mbKuVemp&^ zW#1@%$(TU@u4S#ouY!6_%NomT&586|Et_3_9;n}I*=wP{8Yj@lTJ~OOfO!Ias%8F) zF(&r24cw#Nz`%;lpwNB%T^itenM6@7<9eAygSG5a$WEf+n&PLGCsCbHoWW0mC)4u| z^?7hI#qf?&)si`o<<-|*@C!&DlgD2Zh%)d;2L^i--B>b(Na z=QNtAWt`7xG*!#aEO^Oiq*JvlQSd6L`9fV9*k4u>I)#>M*@3dbpxSi1BV|RNCVE{c z?$NQK>D0}~K2jm|p&8URQR2kxm=HRZK2#KXG&wYj@XQr|mj<{;v*$*u1FX z8=-l0;>n7-s$x}WK4mqPshAC_ijS0_`EqD>XaRjoDCKVv-K1q#RjdsyqIWcPQN;#O ztG}k&y6x-(3&{_13ro!Q^p>NO`Q(2}woK35Rdd~=luL+$^ zuWRb{@|!}->85GQ%0(4-gc1~MRMb@!KMt*+)tbswTmwq|{s;Hrnot|9K7}=vhn18S ziu3Y#XeAxc)I}A~gjUn^CfnvOLhW?9rZN?8f_habWn~ThLCan*e>b#-W=~h`E~@x2 z)JgnddCuTf6@L$P(N0ZeDtzHCnm<#?UJm)fYw2-Kg~PsZn&PLjte4&@iiEqVYL=p+ zMkL%r{LL-484g#3*U=S1saV$2U0U{f`LOVM8qusYFRF-#&!@XIbydZL@J9MrQ<;hi zP~XNmjT-5S@Fx0Ls4EBTDVZ9+kp3Z*@^B&fPG`+6)JaW{6>4fPofht;a!q|gXN0%V z5KXN%mWD5(8cjWDEDwK+Mr+Dzo)Nx`CTQwBb7lBn=xa9R=?q^^Gc+~C+a2CYb2RlM z@5b@?I4F9-XbJzj-eUUqMNsR3EOSbA?iUxRTD-nv={c!dKE3OE3Y0!q?NCF4>KApO)2m_lIw!eL|@|+(a+CG;g9ewB`uf>$!>ibJ&B@ zyqQXcQvPnHDxtQ}RL^VSn`wlmt~Fi@-$HeodewM4d@GH2wcAEt)3STbcf#9fflIcX zmTB2;$hOnvntIIhPWU!@N>itL-wEGNuesXopaWX=BHHbs|8mLhAcNlmBlFuJyMro( zQa!qpjuA@r=uWEDn%|}O!*|j+O%3(DAO1HwSyPu9e+u74O|Eu#(`+q!(cB-to7!Bm zAJAGY+YQ+d=v|lWhxDPAZG-HG@-E1E*h7Uv@wg8w+(X9*rTVa!>Rp<9=>)Ag)l*Zrm!@j!TBD}$Cv>W& zUNuG+K27sn?e@`9ExXqoSGbQlU9x9ry_W5U>>2u_OZF`NP0L<{>{*H|%tieiRSLy( zY+T`U5E%4D;eQ9YJ?ktE@%j9gApe5RZ;F|-)yEv>dxY=R{G;2n?G&P|jUOs!JIpy+ zB>!_wx5t036Tkhq|9_76x5J#H_4KQ~=j_-KuEi+Wcus0(vMtKEua3Y@kFsu?dLSUW1UO)@)%vm~F;BKihl_r^6%MStGQsFh)pl<;N{opfazu4bT z{62m^@yXtP;xoMc#HUNm@b$R(ecVWxiOPM(LGf~s_{8iW@!8lJ=83`m#$mB@SnM1o zK0!N7d{)+OHbibQK9yFV5}$2-Dp7q(d|ve_@yV2d4CB<-;1~>pPrM9+y&DFfVi^XX zS5+H)R#R>8X->7l=S0;8pCnZqd@fXN@Ci@{Vld1z%x{ML=18$Q(%>_lkp`doj5Opt z$>0;Gkp`b1jWqbA=v?#>bz(eUG0dD~$mxc`=QNWHK0%md@Y%~GgHKr|8GN2H3Er8* z=O>d4J}DV!w3eR^_+)5_*)1{jnoovSn~f4fqx7rM;M1N)gU=xv5eegbj?-xHiA|%y zXETikpTb~-ao%#4(>O(^L5iGa=C?B+i7vXBr8EPbe-IoofWP zOAPH2L%VoyH~74x-6$_n`k8y3uo)(HPzCxksK&+#}B^?!o80_Ih@T z<|OmS<@-I?8-FYO0Gc@E_FiWEt)j?#r7Rk?!_X#Tr3zS zSFd4m9Azr%0%RR=2u)kBo-xhB5KW^OOz0rS+!25Zxz;K-F^>nF!>_&IDd`+*3xvqag+o+nbra}(I&vtg})H6iM~PK1`Gnu z!0LafU?JevNJ3z%NLxkPif4b%Mv|hF5$P6@ZV~AgNdFkQM5Nn={{ua4XW z5&koR9}xVI=o}KxJNT4&S<$d%e8nTYZlnj`X0fE&btu|RYT%^N=Un8(lq`0F&+9c8@ z;U|Qj5PqxhTZP{SxHZx%(q55n5q!IbZ0B~tcZlX*!S{;h(}Ew=kTnkpZg`{@9_Dxi zuhx(`!v$~DkU33)Cp2VEtKhvFGG~k67kfC`?SgL?`?m|eN8nx!S^sIl4+uP{A@dIj zPF{&nL*{z~j|r^Skom&}pC+(TL*_RL-XbueA@f@W&kF3-koj8#-zIRohRnZR@Eu<6 z*IvQ*dYS*U;0HBi&LP1KpG59sjz{on4Vg1s@J0=p(Xnh*2n?D58~5Ew?z&KP8P@P5$Ls8CnorCfzvFW zgH3`rTZ3p=QLErt;cpRqFIpWcI0)&FBIK70_!*B0UM=`E!5al{5j-JyR`6cIFUDsm zw??)JXFE8%BYOnjEBFDy4+>5J@e*L2nBdidPYZCgje;iv990|eVMSTt_X=mbz#V`X zQ^5}kqyn*7z^%Lmyw=5pQ!ShkfLkNegwrUT7QqvOw}~_>oL=E<6MVbiJ4CuiI0pn$ zP<-J7r0@lZoC~K~IMW1g6nwf!TZEGkPOrf20(XdXuiys-z9Sq1AO1U3P%Ur-AR@;T ziEl?5h0`KuNHio;EjS$ z2izKI5l%ulS;2b+zgVQ(gtJ{Zdj#Jr_&$*y5Y9p2P@#Cl2Xx_4@M^(F0HUYDX%tS2 z;0eLoMA|F(wnARFw+p^k;69Na5dJ~oP=s}ih>Q{7)=0JB(;|{d!KVwqMK}rJWCiaP ze4F6g1>Yn1UcvVPVkQdbpm3;2dQ>F708tOZsTNM7z?LGe?S$ZMqO(mnI|P3R@ajmc zm}4G+Pd8p2nI?Ff;5!7qBX9&hgLrkMP2j}>cL>}k@Ew6(d|nfFN;6bjw5RMC7kgAwJO<-2w9)UDO^aW-GZWDMwU~H(g5||aZ zM__E2@C9ZC?hzP^i8X=S1nv=dKp<61D}h;o2L#eF%#R6d5x7m@0mUEA(&K0+-YZ^X zJYqa&{KojL@vc#0PBy<|-fR|lR(r1SeC!$Ho$qb&{?NPA`sy-|4<3 zzH@yS`R@1a_PywP&3D)ru?ARiYnqj{zGK~H{m9yFeQuTbtNru*XZg?Z-|BzJ|5N`P ze*Uy5fBMFclZpUNBnq&T4PrMK!Y($<->9TZ$|m8&@%Zvn0DoP2I^eyfivUlIo(|*B%I^St zKg1S>RQwQ7dBm?D0e`FLAwahsWg%I>ZI3U19I&$dS;E~*V$V7HI&jCOa z8TJDY0-DHj0q`)Oi4&m^@CcxZQ=vlO#egOa24&)tyCvWZ12plOnNr}@fF>P-U%BB= zyp#hUflu)o_%?kd@R2wgBv9ySboQ*;>c2G}rgs#Fbp0&JN0 ztZfb8iTIW~e=6cQ;3vV7K_>&6I1{P`{xv}UF8pZVQvpqy275RO05oX^?3pwZ?|V#q zMu0!7+ze>aY4~OdKKBS{;#0emfX@LmX)bIV_*Xto20kCQ4LSqRqy?~T&_e#?1U`}5 z2zVymKbiQwfEj>a$M5$Vco%aj@MZ8|;KU6-CPd$a2ZNRan$!Xh22R`N0AB$Q2Hqvj z1KtJ?1|%7-_ANRiR4f&$JF}@RhD}3kpuJC=|_q6Yz?{B_p z>qM)?T5nx#-C(_D{oeY-D)1lgKf%Akzs|qef0h3p|AT&Smd|9}e;?pUhUH@X)!&Zi zB7J$;(*C?!ImynqHm!{H@_GBC{o5|WSvddVln<2}#+N0+sM0V#!B&VmjbOcrpi(0^ zlZ>EBBdGQwRA><@y$ID=geosWeHNp_i&3G)bSz%S;T6Yx7>U;?ylV08wGOY*c-7-| zJYEf$BV+Iyi`O{3#^c3NG|&b-5hC!^b%I>W@G0pHzVWE@@u=7FsI~E^kntGlvEYpb zZ!CCY!5b^Q`%saeqaMqRCOXb&rpd-aoP{i;HoQ9U>c;B=ye`J;a^np;*Zh?JhSzw{ zr!>#gL>G9fjd$@{iBq(duyw0<2Hojx7W^;3Kl3&klW{kgj9*XXYd7?|p?8~a2K~U- z47}R74?K>8tQi!rs*R9>*X^pBR*|PrsZNV<)h^RmtwHeA#^v3A+;{XHW6_gzqSiJHa+MCz;74RwY#q zh1)lWiU|*6PPF^1@}57UO4_%v=5jiub$x4hDlG*dBnLib5}VBxp`vpY2I2H%M^aU& zsufqh6=P<5M|U!vY_kgpTsDpR9^*ExXpxLzNzTbwp;1e zm=n7vayxhbwE+DEme+sKTv|s>vjpc#0CbNME!)Q6H?)kQxtLgq6&*>S%`>`sI+JNl zak9W%lxptk9)~4PM+wXwCCD#}1tPe1#iAH}GdGrI_H?zjjHM-sj-KSA9#k-h(~}#7 zo{t#}a(a7fcYCTUk=_8JxjWejTRNa|`2m4EN{7MK>R7k*)_098$GvS(oGr`LAXR%h3%z0ZO zM=he+sYKiKM0bLCX%GZ!X#&Bt+K!r19UVzYN2dPNWLGlX-b&5QZOVI_@~9|1dm-a6 zaui3Psz-|)A{U#MsL()gT-4asMw9b{)RRO1!^&&YBZoe{oZ)2lv^2Zkkfqru5^Ul4{$~ zpUWO_Lup@^O!t@a^soy|=9EL6n(SV*VQuo14OlRe9au7x>6MArB!QnJq&ZiiYAYD? za9{3Dp!k%w#@lTsYvdQHH1ES&o=NqjVWQcdPhBfh3voBa-J6LOX{Sd{p9#m(oegzGNuEwY3nTZH`BOS(>%TEa7WQRj5wzOxGV;bd9}okLNZpH5-T z>fRuNGgo7KgPSA|1nj3b%ul3&a8&Gy)K12s)w&~nV6i5rCs*{WT9r(nl1`l`!^yJ~ zR%LfZOB=iKefSkU;LPY;k!)*Aw&gh7QS>e?k)x4Ia_(lhe7o7owVR_?Mwczlw7hk7tGSn9<+9o3 zLUWXLO(?@QVcS%+s~1b!ljkX>Brr$1%;%WOLyqQ==V5k?D6cNscAR5%^5QI&BKs0q zHWZe>Ddvgg1X17C(V+{*S$25s7Xlj@wY=iWcM@!0?KiG6F=njqPImDGr97K`WZaj$ z-H+JJ=h!8iT&cIr&|!?sym+g^zVH!Oj<=Uh(b{n(PkTwwQSIL>^ z(>C|M&b^5AjUcCm8Q-m!lrL9uW>R03Tp0B{f*I1|?2MA@ot`9KX1q$fMmgyk<@$7$ zhf>R9uyP)Qo2V*M+BVLLHZEo}a%}gd$bv zyN$iDyfJk0;4m;cvRYxYB_q|9mns#yShEuI;*yvt$lv zR6H!L5{w4-_g9bSQl0!OSonn_+l#|1cSn-rx+8G7!;T(DPM#l4GkUuc{dVM~{bS>= zDCIIi_^z)VAr-n~pvt5BrplxHBwsWCTQdHccs7Wyk>T6Tosw;2p=3TV&e?g0jlCT$ zXLF&$xuyb+IfGH7AxDoudl+)2SX+Z1=NrGIt6#;~u}Aphxz4!sI3f!_|qj%?#^$zLX|%+3fkUA618udi75ha1ToGmL;I zMurbaNePn?K_>~E!Ei{#=Qqu0S)e?6h8c}T7yDwSQ8mCDG@>!ZYltppszFh8imFpo zm7=N?H9}D%6t&nku-I<9II5d1j_MYRqmFW%ox}?eOnG#UF%-Y@WtjN6HzV3x81cp^ zx>)d%NH}JcM|%ev(Z$i;l7Ypn4r-`k4khl!P#S9B_Z*{(hf;B|0SVhvY6LGs$xbFUyMq!TP>R~j8Z)OHo%G$pq*k{z`#Lw81m@XNwe#N z+6t@tt!N#tCE4pCHt~zf%#1{PzZM|Vj1+?kh&4uv4Q34`Ul4Y$SLUw|+5Vsr_4@*a z5COFtmHItqbZL1sd$-Ak?lq&GfiMpqh(}HQ4pym)uoZ?Edpy!)s4-NJyEEW=;LT{z zW1Fy>Ngo@E(Yri%E)TY5z-jGp0)DoPVz7c9z(5K2E6)zh7Y?Z^bj2H8917YUi7ti# z?qwk8$2`-Ohl0*NW5sAlH2V^&u?0n0fGZqjUo!o|!N|o7rqy%;zZ8jfDpd8?M9!gt zqNu7W_xq#S7hv%jeg*JC>t_O(LfL0ZdNJGK^9AMe8I+R=^N>XFVI0=O{{?<;bak}K zjJB&jqxv}9DA&JPN=2xN4(=A}EZUBV2Y+j2wt{lls!96*#Hy#9bK#kZ(dJ%OMca9X z;=ZvF3deqrJAgnGX3&CXxE|>MN7*e(cB>v`GZyV(o4Byeo)Ao3pu+1>LG`F^ z#mopyWV3e6J?u1QqP6rkrnN9$(7IS8f__`j5Oc4HjzG?OmF5VYrV+({Uo?A-Z8qC$ z7Q%4$`zi*}Ml!R#1(Jag+#ccbRR*!QKqn#F8$dg^gMc`_N%0EUC_W>fy;ix8n_(1I z_AUuNd#$n_XEChvRjgm@SihF7$GN@gZ@h?mbiWh!c4fBC9LDvuGn(D5MKZ)Zg}Elc zRi5gAvM0WZCvGnaj>qlnu?`-$E01;BgX-2JN+ex;T;WxIRPT29`xN(`XaoBPR>gyE z+h{0|#p+WmaDJ_byM#kjiMf4f8_n)g?ix(#=<`lTcggVlOb-uhaoD?5w;H$|y2V%N z)-IS)I+dQ>^MGzGhGC*0|I5@+hJov{6ynZ9PjMw>6NRXHoAed!b)H1~| zr_BgHL1#uH5x;u~0>yq_;x6MwT>Z~eSYd(tr!K#+w2YS%^sGu> zWBNKmU+eTWuCEQI6)>$rP$~=ymc0PiV}a6M1F$GdT9HN|kY2*we7%lgE1@xLAT)-} zgT}CN&=@ui8pDRc!5SQ_&cUi2Y=ncw;c-zRqR8Di%3PEkSAZjyRXpO726$D63g2&F z2fxQ>uT5ILirGnglOX#mAnUap3yhY>0xWwAvU3@^Jg5xtl-3#}*uo|jzRO^n*5GN$ z^dA}Aqjl@V+9zl*i`h3b*rOY88EUl#QF{Q=UIX8e!yj)6e6mOJ@kT%fTWOg@oLKZ+by0$IS1c|(oMRDG^;{J9m zGqDui%uJLU?s1sYH;ZgLFB$q)Ea6KDa|2}e0d9awRSh1H2D=Ix3`r+;j4|A$qDjA8 zvcJOSM$+7l%COVaZX-Rmv`0-%j*sk5}*(wzZM1J z$eD2D*V^(c1=$|We&Q%H;V5pmF)h`l zL0#(9rAl2!@C9?7FDiXH?HFcZVt%s>0~CzO0?4xsnJebWTeLjfF%KDWl05zHC33`3VuC)i%� zdwT(gAoW>nV|Fs6-7fr|YJlfH-s<4vsEf>sGt-H+b5mW;f&Ze_{M6Hc9{#B){7t|Q zDAv!Nv8XAPPByMxTc;m(eQn*udQ|zMNSX75QGc*e9{R=%8k~PxoqwQ4_{Woca-xoZ z+Z?XO;AhD3AAXSW`x<#p^h{u6Y2js}pVWM&zjCMDXJsgFG@!$E8+vuu9zinh^X$1ZQq@F!?e>y|I5 zZ^o&u`|-iDuO#z^YguZ=Im=|UmUSh&G4Orb<|)^&ZCgPLXElzUFp+fFUH{NwBQ?z@ zT(b9z>f+=7zTtNzI}V}y_TT4>$80M9`jJbI2xq71=^Y(&@Fa*jGp#7hq&#JlHeb}h zNZ%CZTl;_1|Bo}k-v^O@Z#SFYNtv(sL_784v)(McmhK_y=5V+L~9DX18_-}?%T@^?SF<%|%|WshR%e$l}%n(F_?pKSmCn*Cp$f&T+C8{5eM literal 0 HcmV?d00001 diff --git a/RenovationWork/ImplementationExtensions/RenovationWorkListImplement.dll b/RenovationWork/ImplementationExtensions/RenovationWorkListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..2f8562ab1a754b1fd6322881a2e0a2a5f33d3336 GIT binary patch literal 25600 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 logger, IBackUpInfo backUpInfo) + { + _logger = logger; + _backUpInfo = backUpInfo; + } + + public void CreateBackUp(BackUpSaveBinidngModel model) + { + if (_backUpInfo == null) + { + return; + } + try + { + _logger.LogDebug("Clear folder"); + // зачистка папки и удаление старого архива + var dirInfo = new DirectoryInfo(model.FolderName); + if (dirInfo.Exists) + { + foreach (var file in dirInfo.GetFiles()) + { + file.Delete(); + } + } + _logger.LogDebug("Delete archive"); + string fileName = $"{model.FolderName}.zip"; + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + // берем метод для сохранения + _logger.LogDebug("Get assembly"); + var typeIId = typeof(IId); + var assembly = typeIId.Assembly; + if (assembly == null) + { + throw new ArgumentNullException("Сборка не найдена", nameof(assembly)); + } + var types = assembly.GetTypes(); + var method = GetType().GetMethod("SaveToFile", BindingFlags.NonPublic | BindingFlags.Instance); + _logger.LogDebug("Find {count} types", types.Length); + foreach (var type in types) + { + if (type.IsInterface && type.GetInterface(typeIId.Name) != null) + { + var modelType = _backUpInfo.GetTypeByModelInterface(type.Name); + if (modelType == null) + { + throw new InvalidOperationException($"Не найден класс-модель для {type.Name}"); + } + _logger.LogDebug("Call SaveToFile method for {name} type", type.Name); + // вызываем метод на выполнение + method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName }); + } + } + _logger.LogDebug("Create zip and remove folder"); + // архивируем + ZipFile.CreateFromDirectory(model.FolderName, fileName); + // удаляем папку + dirInfo.Delete(true); + } + catch (Exception) + { + throw; + } + } + + private void SaveToFile(string folderName) where T : class, new() + { + var records = _backUpInfo.GetList(); + if (records == null) + { + _logger.LogWarning("{type} type get null list", typeof(T).Name); + return; + } + var jsonFormatter = new DataContractJsonSerializer(typeof(List)); + using var fs = new FileStream(string.Format("{0}/{1}.json", folderName, typeof(T).Name), FileMode.OpenOrCreate); + jsonFormatter.WriteObject(fs, records); + } + } +} diff --git a/RenovationWork/RenovationWorkContracts/Attributes/ColumnAttribute.cs b/RenovationWork/RenovationWorkContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..5fbbc5d --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Title { get; private set; } + + public bool Visible { get; private set; } + + public int Width { get; private set; } + + public GridViewAutoSize GridViewAutoSize { get; private set; } + + public bool IsUseAutoSize { get; private set; } + + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + } +} diff --git a/RenovationWork/RenovationWorkContracts/Attributes/GridViewAutoSize.cs b/RenovationWork/RenovationWorkContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..369882f --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} diff --git a/RenovationWork/RenovationWorkContracts/BindingModels/BackUpSaveBinidngModel.cs b/RenovationWork/RenovationWorkContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..8cfacee --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/RenovationWork/RenovationWorkContracts/BindingModels/MessageInfoBindingModel.cs b/RenovationWork/RenovationWorkContracts/BindingModels/MessageInfoBindingModel.cs index fac13a2..ce08f7d 100644 --- a/RenovationWork/RenovationWorkContracts/BindingModels/MessageInfoBindingModel.cs +++ b/RenovationWork/RenovationWorkContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,7 @@ namespace RenovationWorkContracts.BindingModels public DateTime DateDelivery { get; set; } public string Subject { get; set; } = string.Empty; public string Body { get; set; } = string.Empty; + + public int Id => throw new NotImplementedException(); } } diff --git a/RenovationWork/RenovationWorkContracts/BusinessLogicsContracts/IBackUpLogic.cs b/RenovationWork/RenovationWorkContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..a81a807 --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using RenovationWorkContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/RenovationWork/RenovationWorkContracts/DI/DependencyManager.cs b/RenovationWork/RenovationWorkContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..78b1ba4 --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/DI/DependencyManager.cs @@ -0,0 +1,66 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + + private static DependencyManager? _manager; + + private static readonly object _locjObject = new(); + + private DependencyManager() + { + _dependencyManager = new ServiceDependencyContainer(); + } + + public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } + + ///

+ /// Иницализация библиотек, в которых идут установки зависомстей + /// + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); + } + + /// + /// Регистрация логгера + /// + /// + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + public T Resolve() => _dependencyManager.Resolve(); + } +} diff --git a/RenovationWork/RenovationWorkContracts/DI/IDependencyContainer.cs b/RenovationWork/RenovationWorkContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..188fde0 --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/DI/IDependencyContainer.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.DI +{ + public interface IDependencyContainer + { + /// + /// Регистрация логгера + /// + /// + void AddLogging(Action configure); + + /// + /// Добавление зависимости + /// + /// + /// + /// + void RegisterType(bool isSingle) where U : class, T where T : class; + + /// + /// Добавление зависимости + /// + /// + /// + void RegisterType(bool isSingle) where T : class; + + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + T Resolve(); + } +} diff --git a/RenovationWork/RenovationWorkContracts/DI/IImplementationExtension.cs b/RenovationWork/RenovationWorkContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..7a5c461 --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/RenovationWork/RenovationWorkContracts/DI/ServiceDependencyContainer.cs b/RenovationWork/RenovationWorkContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..17973a5 --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,62 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.DI +{ + public class ServiceDependencyContainer : IDependencyContainer + { + private ServiceProvider? _serviceProvider; + + private readonly ServiceCollection _serviceCollection; + + public ServiceDependencyContainer() + { + _serviceCollection = new ServiceCollection(); + } + + public void AddLogging(Action configure) + { + _serviceCollection.AddLogging(configure); + } + + public void RegisterType(bool isSingle) where U : class, T where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + _serviceProvider = null; + } + + public void RegisterType(bool isSingle) where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + _serviceProvider = null; + } + + public T Resolve() + { + if (_serviceProvider == null) + { + _serviceProvider = _serviceCollection.BuildServiceProvider(); + } + return _serviceProvider.GetService()!; + } + } +} diff --git a/RenovationWork/RenovationWorkContracts/DI/ServiceProviderLoader.cs b/RenovationWork/RenovationWorkContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..e0911b7 --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.DI +{ + public class ServiceProviderLoader + { + /// + /// Загрузка всех классов-реализаций IImplementationExtension + /// + /// + public static IImplementationExtension? GetImplementationExtensions() + { + IImplementationExtension? source = null; + var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); + foreach (var file in files.Distinct()) + { + Assembly asm = Assembly.LoadFrom(file); + foreach (var t in asm.GetExportedTypes()) + { + if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) + { + if (source == null) + { + source = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + if (newSource.Priority > source.Priority) + { + source = newSource; + } + } + } + } + } + return source; + } + + private static string TryGetImplementationExtensionsFolder() + { + var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); + while (directory != null && !directory.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) + { + directory = directory.Parent; + } + return $"{directory?.FullName}\\ImplementationExtensions"; + } + } +} diff --git a/RenovationWork/RenovationWorkContracts/RenovationWorkContracts.csproj b/RenovationWork/RenovationWorkContracts/RenovationWorkContracts.csproj index 96ab30f..6b1e6c8 100644 --- a/RenovationWork/RenovationWorkContracts/RenovationWorkContracts.csproj +++ b/RenovationWork/RenovationWorkContracts/RenovationWorkContracts.csproj @@ -6,6 +6,10 @@ enable + + + + diff --git a/RenovationWork/RenovationWorkContracts/StorageContracts/IBackUpInfo.cs b/RenovationWork/RenovationWorkContracts/StorageContracts/IBackUpInfo.cs new file mode 100644 index 0000000..842b36c --- /dev/null +++ b/RenovationWork/RenovationWorkContracts/StorageContracts/IBackUpInfo.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkContracts.StorageContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/RenovationWork/RenovationWorkContracts/ViewModels/ClientViewModel.cs b/RenovationWork/RenovationWorkContracts/ViewModels/ClientViewModel.cs index 5f014ed..9e13ef6 100644 --- a/RenovationWork/RenovationWorkContracts/ViewModels/ClientViewModel.cs +++ b/RenovationWork/RenovationWorkContracts/ViewModels/ClientViewModel.cs @@ -1,4 +1,5 @@ -using RenovationWorkDataModels.Models; +using RenovationWorkContracts.Attributes; +using RenovationWorkDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,15 +11,16 @@ namespace RenovationWorkContracts.ViewModels { public class ClientViewModel : IClientModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО клиента")] + [Column(title: "ФИО клиента", width: 150)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] + [Column(title: "Логин (эл. почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 150)] public string Password { get; set; } = string.Empty; } } diff --git a/RenovationWork/RenovationWorkContracts/ViewModels/ComponentViewModel.cs b/RenovationWork/RenovationWorkContracts/ViewModels/ComponentViewModel.cs index e230a21..6d5da61 100644 --- a/RenovationWork/RenovationWorkContracts/ViewModels/ComponentViewModel.cs +++ b/RenovationWork/RenovationWorkContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ -using RenovationWorkDataModels.Models; +using RenovationWorkContracts.Attributes; +using RenovationWorkDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,14 +11,12 @@ namespace RenovationWorkContracts.ViewModels { public class ComponentViewModel : IComponentModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название компонента")] + [Column("Название комплектующего", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] - + [Column("Цена", width: 80)] public double Cost { get; set; } - [DisplayName("Название изделия")] - public string RepairName { get; set; } = string.Empty; } } diff --git a/RenovationWork/RenovationWorkContracts/ViewModels/ImplementerViewModel.cs b/RenovationWork/RenovationWorkContracts/ViewModels/ImplementerViewModel.cs index c4d850f..b4f7ed5 100644 --- a/RenovationWork/RenovationWorkContracts/ViewModels/ImplementerViewModel.cs +++ b/RenovationWork/RenovationWorkContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using RenovationWorkDataModels.Models; +using RenovationWorkContracts.Attributes; +using RenovationWorkDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,18 +11,19 @@ namespace RenovationWorkContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО исполнителя")] + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column("Пароль", width: 150)] public string Password { get; set; } = string.Empty; - [DisplayName("Стаж работы")] + [Column("Стаж работы", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int WorkExperience { get; set; } - [DisplayName("Квалификация")] + [Column("Квалификация", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int Qualification { get; set; } } } diff --git a/RenovationWork/RenovationWorkContracts/ViewModels/MessageInfoModel.cs b/RenovationWork/RenovationWorkContracts/ViewModels/MessageInfoModel.cs index 61c415e..0bdb911 100644 --- a/RenovationWork/RenovationWorkContracts/ViewModels/MessageInfoModel.cs +++ b/RenovationWork/RenovationWorkContracts/ViewModels/MessageInfoModel.cs @@ -1,4 +1,5 @@ -using RenovationWorkDataModels.Models; +using RenovationWorkContracts.Attributes; +using RenovationWorkDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,16 +11,23 @@ namespace RenovationWorkContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { + [Column(visible: false)] public string MessageId { get; set; } = string.Empty; - + [Column(visible: false)] public int? ClientId { get; set; } - [DisplayName("Отправитель")] + + [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] + + [Column("Дата письма", width: 100)] public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] + + [Column("Заголовок", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] + + [Column("Текст", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; + [Column(visible: false)] + public int Id => throw new NotImplementedException(); } } diff --git a/RenovationWork/RenovationWorkContracts/ViewModels/OrderViewModel.cs b/RenovationWork/RenovationWorkContracts/ViewModels/OrderViewModel.cs index 28155c4..0f95302 100644 --- a/RenovationWork/RenovationWorkContracts/ViewModels/OrderViewModel.cs +++ b/RenovationWork/RenovationWorkContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using RenovationWorkDataModels.Enums; +using RenovationWorkContracts.Attributes; +using RenovationWorkDataModels.Enums; using RenovationWorkDataModels.Models; using System; using System.Collections.Generic; @@ -11,29 +12,30 @@ namespace RenovationWorkContracts.ViewModels { public class OrderViewModel : IOrderModel { - public int ClientId { get; set; } - public int? ImplementerId { get; set; } - public int RepairId { get; set; } - [DisplayName("Номер")] + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int Id { get; set; } - [DisplayName("Ремонт")] - public string RepairName { get; set; } = string.Empty; - [DisplayName("Исполнитель")] - public string ImplementerFIO { get; set; } = string.Empty; - - [DisplayName("Количество")] - public int Count { get; set; } - [DisplayName("Сумма")] - public double Sum { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } - - [DisplayName("Фамилия клиента")] + [Column(visible: false)] + public int RepairId { get; set; } + [Column(visible: false)] + public int ClientId { get; set; } + [Column("Данные клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ClientFIO { get; set; } = string.Empty; - + [Column(visible: false)] + public int? ImplementerId { get; set; } + [Column("Данные исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; + [Column("Компьютер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string RepairName { get; set; } = string.Empty; + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } + } } diff --git a/RenovationWork/RenovationWorkContracts/ViewModels/RepairViewModel.cs b/RenovationWork/RenovationWorkContracts/ViewModels/RepairViewModel.cs index c416b16..218bcc8 100644 --- a/RenovationWork/RenovationWorkContracts/ViewModels/RepairViewModel.cs +++ b/RenovationWork/RenovationWorkContracts/ViewModels/RepairViewModel.cs @@ -1,4 +1,5 @@ -using RenovationWorkDataModels.Models; +using RenovationWorkContracts.Attributes; +using RenovationWorkDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,21 @@ namespace RenovationWorkContracts.ViewModels { public class RepairViewModel : IRepairModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название ремонта")] + + [Column("Название компьютера", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string RepairName { get; set; } = string.Empty; - [DisplayName("Цена")] + + [Column("Цена", width: 100)] public double Price { get; set; } - public Dictionary RepairComponents { get; set; } = new(); + + [Column(visible: false)] + public Dictionary RepairComponents + { + get; + set; + } = new(); } } diff --git a/RenovationWork/RenovationWorkDataModels/Models/IMessageInfoModel.cs b/RenovationWork/RenovationWorkDataModels/Models/IMessageInfoModel.cs index bea1c89..d4e6654 100644 --- a/RenovationWork/RenovationWorkDataModels/Models/IMessageInfoModel.cs +++ b/RenovationWork/RenovationWorkDataModels/Models/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace RenovationWorkDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/RenovationWork/RenovationWorkDatabaseImplement/DatabaseImplementationExtension.cs b/RenovationWork/RenovationWorkDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..25fc2dc --- /dev/null +++ b/RenovationWork/RenovationWorkDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,27 @@ +using RenovationWorkContracts.DI; +using RenovationWorkContracts.StorageContracts; +using RenovationWorkDatabaseImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkDatabaseImplement +{ + public class DatabaseImplementationExtension : IImplementationExtension + { + public int Priority => 2; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/RenovationWork/RenovationWorkDatabaseImplement/Implements/BackUpInfo.cs b/RenovationWork/RenovationWorkDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..e44bed9 --- /dev/null +++ b/RenovationWork/RenovationWorkDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,32 @@ +using RenovationWorkContracts.StorageContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new RenovationWorkDatabase(); + return context.Set().ToList(); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } +} diff --git a/RenovationWork/RenovationWorkDatabaseImplement/Model/MessageInfo.cs b/RenovationWork/RenovationWorkDatabaseImplement/Model/MessageInfo.cs index e5f41ca..ee2e19e 100644 --- a/RenovationWork/RenovationWorkDatabaseImplement/Model/MessageInfo.cs +++ b/RenovationWork/RenovationWorkDatabaseImplement/Model/MessageInfo.cs @@ -49,5 +49,7 @@ namespace RenovationWorkDatabaseImplement.Model Subject = Subject, Body = Body }; + + public int Id => throw new NotImplementedException(); } } diff --git a/RenovationWork/RenovationWorkDatabaseImplement/RenovationWorkDatabaseImplement.csproj b/RenovationWork/RenovationWorkDatabaseImplement/RenovationWorkDatabaseImplement.csproj index 1011373..60788a7 100644 --- a/RenovationWork/RenovationWorkDatabaseImplement/RenovationWorkDatabaseImplement.csproj +++ b/RenovationWork/RenovationWorkDatabaseImplement/RenovationWorkDatabaseImplement.csproj @@ -21,4 +21,8 @@ + + + + diff --git a/RenovationWork/RenovationWorkFileImplement/FileImplementationExtension.cs b/RenovationWork/RenovationWorkFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..0249184 --- /dev/null +++ b/RenovationWork/RenovationWorkFileImplement/FileImplementationExtension.cs @@ -0,0 +1,27 @@ +using RenovationWorkContracts.DI; +using RenovationWorkContracts.StorageContracts; +using RenovationWorkFileImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkFileImplement +{ + public class FileImplementationExtension : IImplementationExtension + { + public int Priority => 1; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/RenovationWork/RenovationWorkFileImplement/Implements/BackUpInfo.cs b/RenovationWork/RenovationWorkFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..ba8f773 --- /dev/null +++ b/RenovationWork/RenovationWorkFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,35 @@ +using RenovationWorkContracts.StorageContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + // Получаем значения из singleton-объекта универсального свойства содержащее тип T + var source = DataFileSingleton.GetInstance(); + return (List?)source.GetType().GetProperties() + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == typeof(T)) + ?.GetValue(source); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } +} diff --git a/RenovationWork/RenovationWorkFileImplement/Models/MessageInfo.cs b/RenovationWork/RenovationWorkFileImplement/Models/MessageInfo.cs index 3850c25..46769b8 100644 --- a/RenovationWork/RenovationWorkFileImplement/Models/MessageInfo.cs +++ b/RenovationWork/RenovationWorkFileImplement/Models/MessageInfo.cs @@ -76,6 +76,8 @@ namespace RenovationWorkFileImplement.Models new XAttribute("SenderName", SenderName), new XAttribute("DateDelivery", DateDelivery) ); + + public int Id => throw new NotImplementedException(); } } diff --git a/RenovationWork/RenovationWorkFileImplement/RenovationWorkFileImplement.csproj b/RenovationWork/RenovationWorkFileImplement/RenovationWorkFileImplement.csproj index 2d896a8..6dfa58a 100644 --- a/RenovationWork/RenovationWorkFileImplement/RenovationWorkFileImplement.csproj +++ b/RenovationWork/RenovationWorkFileImplement/RenovationWorkFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/RenovationWork/RenovationWorkListImplement/Implements/BackUpInfo.cs b/RenovationWork/RenovationWorkListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..0d08830 --- /dev/null +++ b/RenovationWork/RenovationWorkListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,22 @@ +using RenovationWorkContracts.StorageContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkListImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + throw new NotImplementedException(); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + throw new NotImplementedException(); + } + } +} diff --git a/RenovationWork/RenovationWorkListImplement/ListImplementationExtension.cs b/RenovationWork/RenovationWorkListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..21a1d95 --- /dev/null +++ b/RenovationWork/RenovationWorkListImplement/ListImplementationExtension.cs @@ -0,0 +1,27 @@ +using RenovationWorkContracts.DI; +using RenovationWorkContracts.StorageContracts; +using RenovationWorkListImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkListImplement +{ + public class ListImplementationExtension : IImplementationExtension + { + public int Priority => 0; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/RenovationWork/RenovationWorkListImplement/Models/MessageInfo.cs b/RenovationWork/RenovationWorkListImplement/Models/MessageInfo.cs index 89b5c61..c0cb3f4 100644 --- a/RenovationWork/RenovationWorkListImplement/Models/MessageInfo.cs +++ b/RenovationWork/RenovationWorkListImplement/Models/MessageInfo.cs @@ -42,5 +42,7 @@ namespace RenovationWorkListImplement.Models SenderName = SenderName, DateDelivery = DateDelivery, }; + + public int Id => throw new NotImplementedException(); } } diff --git a/RenovationWork/RenovationWorkListImplement/RenovationWorkListImplement.csproj b/RenovationWork/RenovationWorkListImplement/RenovationWorkListImplement.csproj index 2d896a8..6dfa58a 100644 --- a/RenovationWork/RenovationWorkListImplement/RenovationWorkListImplement.csproj +++ b/RenovationWork/RenovationWorkListImplement/RenovationWorkListImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/RenovationWork/RenovationWorkView/DataGridViewExtension.cs b/RenovationWork/RenovationWorkView/DataGridViewExtension.cs new file mode 100644 index 0000000..949a34f --- /dev/null +++ b/RenovationWork/RenovationWorkView/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using RenovationWorkContracts.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RenovationWorkView +{ + internal static class DataGridViewExtension + { + public static void FillAndConfigGrid(this DataGridView grid, List? data) + { + if (data == null) + { + return; + } + grid.DataSource = data; + + var type = typeof(T); + var properties = type.GetProperties(); + foreach (DataGridViewColumn column in grid.Columns) + { + var property = properties.FirstOrDefault(x => x.Name == column.Name); + if (property == null) + { + throw new InvalidOperationException($"В типе {type.Name} не найдено свойство с именем {column.Name}"); + } + var attribute = property.GetCustomAttributes(typeof(ColumnAttribute), true)?.SingleOrDefault(); + if (attribute == null) + { + throw new InvalidOperationException($"Не найден атрибут типа ColumnAttribute для свойства {property.Name}"); + } + // ищем нужный нам атрибут + if (attribute is ColumnAttribute columnAttr) + { + column.HeaderText = columnAttr.Title; + column.Visible = columnAttr.Visible; + if (columnAttr.IsUseAutoSize) + { + column.AutoSizeMode = (DataGridViewAutoSizeColumnMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); + } + else + { + column.Width = columnAttr.Width; + } + } + } + } + } +} \ No newline at end of file diff --git a/RenovationWork/RenovationWorkView/FormClients.cs b/RenovationWork/RenovationWorkView/FormClients.cs index c0cbbfb..df6347d 100644 --- a/RenovationWork/RenovationWorkView/FormClients.cs +++ b/RenovationWork/RenovationWorkView/FormClients.cs @@ -35,13 +35,7 @@ namespace RenovationWorkView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) diff --git a/RenovationWork/RenovationWorkView/FormComponents.cs b/RenovationWork/RenovationWorkView/FormComponents.cs index 55f8d29..b8c7987 100644 --- a/RenovationWork/RenovationWorkView/FormComponents.cs +++ b/RenovationWork/RenovationWorkView/FormComponents.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.BusinessLogicsContracts; +using RenovationWorkContracts.DI; using RenovationWorkView; using System; using System.Collections.Generic; @@ -56,7 +57,7 @@ namespace PrecastConcretePlantView private void AddButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); + var service = DependencyManager.Instance.Resolve(); if (service is FormComponent form) { @@ -70,7 +71,7 @@ namespace PrecastConcretePlantView { if (DataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); + var service = DependencyManager.Instance.Resolve(); if (service is FormComponent form) { diff --git a/RenovationWork/RenovationWorkView/FormImplementers.cs b/RenovationWork/RenovationWorkView/FormImplementers.cs index dbdabf7..ab22965 100644 --- a/RenovationWork/RenovationWorkView/FormImplementers.cs +++ b/RenovationWork/RenovationWorkView/FormImplementers.cs @@ -1,6 +1,8 @@ using Microsoft.Extensions.Logging; +using PrecastConcretePlantView; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.BusinessLogicsContracts; +using RenovationWorkContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -53,7 +55,7 @@ namespace RenovationWorkView private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + var service = DependencyManager.Instance.Resolve(); if (service is FormImplementer form) { if (form.ShowDialog() == DialogResult.OK) @@ -67,7 +69,7 @@ namespace RenovationWorkView { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + var service = DependencyManager.Instance.Resolve(); if (service is FormImplementer form) { form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); diff --git a/RenovationWork/RenovationWorkView/FormMain.Designer.cs b/RenovationWork/RenovationWorkView/FormMain.Designer.cs index 843fdb4..33d6c87 100644 --- a/RenovationWork/RenovationWorkView/FormMain.Designer.cs +++ b/RenovationWork/RenovationWorkView/FormMain.Designer.cs @@ -41,6 +41,7 @@ this.запускРаботыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.письмаToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.письмаToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.создатьBackupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.DataGridView = new System.Windows.Forms.DataGridView(); this.CreateOrderButton = new System.Windows.Forms.Button(); this.TakeOrderInWorkButton = new System.Windows.Forms.Button(); @@ -59,7 +60,8 @@ this.отчетыToolStripMenuItem, this.запускРаботыToolStripMenuItem, this.письмаToolStripMenuItem, - this.письмаToolStripMenuItem1}); + this.письмаToolStripMenuItem1, + this.создатьBackupToolStripMenuItem}); this.MenuStrip.Location = new System.Drawing.Point(0, 0); this.MenuStrip.Name = "MenuStrip"; this.MenuStrip.Padding = new System.Windows.Forms.Padding(7, 3, 0, 3); @@ -156,6 +158,13 @@ this.письмаToolStripMenuItem1.Text = "Письма"; this.письмаToolStripMenuItem1.Click += new System.EventHandler(this.письмаToolStripMenuItem_Click); // + // создатьBackupToolStripMenuItem + // + this.создатьBackupToolStripMenuItem.Name = "создатьBackupToolStripMenuItem"; + this.создатьBackupToolStripMenuItem.Size = new System.Drawing.Size(130, 24); + this.создатьBackupToolStripMenuItem.Text = "Cоздать backup"; + this.создатьBackupToolStripMenuItem.Click += new System.EventHandler(this.CreateBackupToolStripMenuItem_Click); + // // DataGridView // this.DataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) @@ -279,5 +288,6 @@ private ToolStripMenuItem запускРаботыToolStripMenuItem; private ToolStripMenuItem письмаToolStripMenuItem; private ToolStripMenuItem письмаToolStripMenuItem1; + private ToolStripMenuItem создатьBackupToolStripMenuItem; } } \ No newline at end of file diff --git a/RenovationWork/RenovationWorkView/FormMain.cs b/RenovationWork/RenovationWorkView/FormMain.cs index da407a1..300a7a4 100644 --- a/RenovationWork/RenovationWorkView/FormMain.cs +++ b/RenovationWork/RenovationWorkView/FormMain.cs @@ -2,6 +2,7 @@ using RenovationWorkBusinessLogic.BusinessLogic; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.BusinessLogicsContracts; +using RenovationWorkContracts.DI; using RenovationWorkDataModels.Enums; using RenovationWorkView; using System; @@ -26,14 +27,16 @@ namespace PrecastConcretePlantView private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workProcess; + private readonly IBackUpLogic _backUpLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IBackUpLogic backUpLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; _workProcess = workProcess; + _backUpLogic = backUpLogic; } private void FormMain_Load(object sender, EventArgs e) @@ -66,7 +69,7 @@ namespace PrecastConcretePlantView private void КомпонентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); + var service = DependencyManager.Instance.Resolve(); if (service is FormComponents form) { @@ -76,7 +79,7 @@ namespace PrecastConcretePlantView private void ИзделияToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormRepairs)); + var service = DependencyManager.Instance.Resolve(); if (service is FormRepairs form) { @@ -86,7 +89,7 @@ namespace PrecastConcretePlantView private void CreateOrderButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); + var service = DependencyManager.Instance.Resolve(); if (service is FormCreateOrder form) { @@ -96,7 +99,8 @@ namespace PrecastConcretePlantView } private void ClientsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); + var service = DependencyManager.Instance.Resolve(); + if (service is FormClients form) { form.ShowDialog(); @@ -104,7 +108,8 @@ namespace PrecastConcretePlantView } private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + var service = DependencyManager.Instance.Resolve(); + if (service is FormImplementers form) { form.ShowDialog(); @@ -227,7 +232,7 @@ namespace PrecastConcretePlantView } private void ComponentProductsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportRepairComponents)); + var service = DependencyManager.Instance.Resolve(); if (service is FormReportRepairComponents form) { form.ShowDialog(); @@ -236,7 +241,7 @@ namespace PrecastConcretePlantView private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); + var service = DependencyManager.Instance.Resolve(); if (service is FormReportOrders form) { form.ShowDialog(); @@ -249,17 +254,43 @@ namespace PrecastConcretePlantView private void DataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) { + } + private void CreateBackupToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } private void запускРаботыToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + _workProcess.DoWork((DependencyManager.Instance.Resolve() as IImplementerLogic)!, _orderLogic); MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void письмаToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormMail)); + var service = DependencyManager.Instance.Resolve(); + if (service is FormMail form) { form.ShowDialog(); diff --git a/RenovationWork/RenovationWorkView/FormRepair.cs b/RenovationWork/RenovationWorkView/FormRepair.cs index 7c9c87f..ca8cf5e 100644 --- a/RenovationWork/RenovationWorkView/FormRepair.cs +++ b/RenovationWork/RenovationWorkView/FormRepair.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using Microsoft.Extensions.Logging; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.BusinessLogicsContracts; +using RenovationWorkContracts.DI; using RenovationWorkContracts.SeatchModels; using RenovationWorkDataModels.Models; using RenovationWorkView; @@ -86,7 +87,7 @@ namespace PrecastConcretePlantView } private void AddButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormRepairComponent)); + var service = DependencyManager.Instance.Resolve(); if (service is FormRepairComponent form) { @@ -118,7 +119,7 @@ namespace PrecastConcretePlantView { if (DataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormRepairComponent)); + var service = DependencyManager.Instance.Resolve(); if (service is FormRepairComponent form) { diff --git a/RenovationWork/RenovationWorkView/FormRepairs.cs b/RenovationWork/RenovationWorkView/FormRepairs.cs index 6f01c74..d1c8ddc 100644 --- a/RenovationWork/RenovationWorkView/FormRepairs.cs +++ b/RenovationWork/RenovationWorkView/FormRepairs.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using Microsoft.Extensions.Logging; using RenovationWorkContracts.BindingModels; using RenovationWorkContracts.BusinessLogicsContracts; +using RenovationWorkContracts.DI; using RenovationWorkView; namespace PrecastConcretePlantView @@ -57,7 +58,7 @@ namespace PrecastConcretePlantView private void AddButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormRepair)); + var service = DependencyManager.Instance.Resolve(); if (service is FormRepair form) { @@ -71,7 +72,7 @@ namespace PrecastConcretePlantView { if (DataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormRepair)); + var service = DependencyManager.Instance.Resolve(); if (service is FormRepair form) { diff --git a/RenovationWork/RenovationWorkView/Program.cs b/RenovationWork/RenovationWorkView/Program.cs index 8663061..f02334c 100644 --- a/RenovationWork/RenovationWorkView/Program.cs +++ b/RenovationWork/RenovationWorkView/Program.cs @@ -11,25 +11,22 @@ using RenovationWorkBusinessLogic.OfficePackage.Implements; using RenovationWorkBusinessLogic.OfficePackage; using RenovationWorkBusinessLogic.MailWorker; using RenovationWorkContracts.BindingModels; +using RenovationWorkContracts.DI; namespace RenovationWorkView { internal static class Program { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; - [STAThread] static void Main() { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); - + InitDependency(); try { - var mailSender = _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, @@ -40,65 +37,53 @@ namespace RenovationWorkView PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) }); - // - var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 1000); + var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); } catch (Exception ex) { - var logger = _serviceProvider.GetService(); - logger?.LogError(ex, " "); + var logger = DependencyManager.Instance.Resolve(); + logger?.LogError(ex, "Error"); } - - Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(DependencyManager.Instance.Resolve()); } - - private static void ConfigureServices(ServiceCollection services) + private static void InitDependency() { - services.AddLogging(option => + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddSingleton(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(true); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); } - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); } } \ No newline at end of file