From 46724ecdc340fc74e8f577a62beb2106355026c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=AF=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D1=87=D1=83=D0=BA?= Date: Fri, 21 Jun 2024 08:58:15 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MotorPlantContracts.dll | Bin 0 -> 30720 bytes .../MotorPlantDataModels.dll | Bin 0 -> 6656 bytes .../MotorPlantDatabaseImplement.dll | Bin 0 -> 82944 bytes .../MotorPlantFileImplement.dll | Bin 0 -> 40448 bytes .../MotorPlantListImplement.dll | Bin 0 -> 26112 bytes .../MotorPlantBusinessLogic/BackUpLogic.cs | 98 +++++++++++++++ .../Attributes/ColumnAttribute.cs | 26 ++++ .../Attributes/GridViewAutoSize.cs | 20 +++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 ++ .../BindingModels/MessageInfoBindingModel.cs | 1 + .../BusinessLogicsContracts/IBackUpLogic.cs | 14 +++ .../DI/DependencyManager.cs | 58 +++++++++ .../DI/IDependencyContainer.cs | 37 ++++++ .../DI/IImplementationExtension.cs | 17 +++ .../DI/ServiceDependencyContainer.cs | 56 +++++++++ .../DI/ServiceProviderLoader.cs | 54 ++++++++ .../StoragesContracts/IBackUpInfo.cs | 14 +++ .../ViewModels/ClientViewModel.cs | 8 +- .../ViewModels/ComponentViewModel.cs | 6 +- .../ViewModels/EngineViewModel.cs | 7 +- .../ViewModels/ImplementerViewModel.cs | 10 +- .../ViewModels/MessageInfoViewModel.cs | 13 +- .../ViewModels/OrderViewModel.cs | 22 ++-- .../MotorPlantDataModels/IImplementerModel.cs | 2 +- .../MotorPlantDataModels/IMessageInfoModel.cs | 2 +- .../MotorPlantDatabaseImplement/BackUpInfo.cs | 31 +++++ .../MotorPlantDatabaseImplement/Client.cs | 24 ++-- .../MotorPlantDatabaseImplement/Component.cs | 5 + .../MotorPlantDatabaseImplement/Engine.cs | 9 +- .../ImplementationExtension.cs | 21 ++++ .../Implementer.cs | 7 ++ .../MessageInfo.cs | 15 +++ .../MotorPlantDatabaseImplement.csproj | 4 + .../MotorPlantDatabaseImplement/Order.cs | 11 ++ .../MotorPlantFileImplement/BackUpInfo.cs | 41 ++++++ MotorPlant/MotorPlantFileImplement/Client.cs | 6 + .../MotorPlantFileImplement/Component.cs | 5 + MotorPlant/MotorPlantFileImplement/Engine.cs | 5 + .../ImplementationExtension.cs | 21 ++++ .../MotorPlantFileImplement/Implementer.cs | 7 ++ .../MotorPlantFileImplement/MessageInfo.cs | 10 ++ .../MotorPlantFileImplement.csproj | 4 + MotorPlant/MotorPlantFileImplement/Order.cs | 11 ++ .../MotorPlantListImplement/BackUpInfo.cs | 21 ++++ .../ImplementationExtension.cs | 21 ++++ .../MotorPlantListImplement/MessageInfo.cs | 1 + .../MotorPlantListImplement.csproj | 4 + .../MotorPlantView/DataGridViewExtension.cs | 51 ++++++++ MotorPlant/MotorPlantView/FormClients.cs | 15 +-- MotorPlant/MotorPlantView/FormComponents.cs | 22 ++-- MotorPlant/MotorPlantView/FormEngine.cs | 81 ++++++------ MotorPlant/MotorPlantView/FormEngines.cs | 30 ++--- .../MotorPlantView/FormMain.Designer.cs | 19 ++- MotorPlant/MotorPlantView/FormMain.cs | 118 ++++++++---------- .../MotorPlantView/FormViewMail.Designer.cs | 6 +- MotorPlant/MotorPlantView/FormViewMail.cs | 9 +- MotorPlant/MotorPlantView/ImplementersForm.cs | 17 +-- MotorPlant/MotorPlantView/Program.cs | 105 +++++++--------- 58 files changed, 950 insertions(+), 285 deletions(-) create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantContracts.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDataModels.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll create mode 100644 MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs create mode 100644 MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs create mode 100644 MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs create mode 100644 MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/DependencyManager.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs create mode 100644 MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantFileImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantListImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantListImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantView/DataGridViewExtension.cs diff --git a/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll b/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..8257f45d9b099e8334691faef8d77bf3e94d00f2 GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..3c3ed4481375225c19dcf2707c044a347981c746 GIT binary patch literal 82944 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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..c22c3c1c414ce8574f0b2d55c8b012165c8ed65f GIT binary patch literal 40448 zcmeHwdwf*Ywf{P2X3k7zCXbmscm+r#=s-dYPeBn04>8L7p(t1~Bm+j049o1ulC}jpkT!pYSm)vgH*KAYKxCry=nzTd$p~-_S##miofq#d!I9BlIZQdzu!N< z&+j)n>#WyaYwfky-shZs&V)JVT|*us^5XmDmqhz;xWeC0l4 z_VbmCFK9_utW70Xr{ZlDP4V{jWJkryL`7t0DXpwuI)%{=m0(LdH~3z zuR3l}@~I$dtWBj;O`s&U{Xn>*-^bVWnTp}6O(j~BP~=$YFurW-W_(?rsYKIUq@abI zS9~}&lYBH4oy>fL2wD6eeU39@5uzZCT&WSW-__G$Zg`pJ=1v&(j+|l(JiTbd>>WA8 z+!W;Fai*tJ5HLbELl7{~O{F0S82L6s5HJdCh9F=R+6+O8>r5Jk9wMX&ZT3J`a?A)? zHDOBkN6}@Nqxhj}@{jzT8S{Z{ZbJIKDKuKU`D9?jNA){?^CTe0tOp=YN741+8J5JL zQ%&41Puii3y{UfO?v&his4FX7EbUklLk?6szqEr_Z|VeYH#xT*>efn^NIRCq5U^^8 z6d_Ku_NK;jyHj)9VZ5z$skCEB3>{MKkT|qM&3aRqlWR9m$!+&Aw=0u&Ea7yxF?H=KFDo&Q@IH|bKN8d$`_+zHlpgj)@gRxIJlsg9w* zrIjSOfm_YUZS_-bRW7Yq!ogL?Q1sG@laq>bD~zc-!pFGPU}?pY7^@qkdN-1gsTaF=+a@AJs8T*y@l!eF9qFmW}~>Vj}>FMh5$h zgbh1hphPinf@MkAskU(}NDht}>fo4l4vq?SaLf(|N5!Mev8qXd@!|x_YUvRK44798 zLBN0y#SjDxI8qEj5U+=3BUBW;^qtooAC-ivC#S110>jN@4f>EovMmBJiU}lGh*~Cw zY2rjCkW`B#tHpI*y1FmBo!V|{BPu~so2=ueqXA-L7}LH|mpTe#nLUnycAdJe51Ec6 z^@BcS*}xDJj}ffl41+#<)LQGI>JvEfU(JzD`UdS6p9M!GoN4DJiH1In_c;Wde1fOA5BU zbWvZnR%u(=^!2PMZ9nyZo$+M0rnI}%^Sx!U`W_)j?O^ivtet_V5RN@2#z1iFF^PTT zBk5@%P$8H}R&qLUE*BJ+mBb<`1ZIGhoXLb*Lo8YYA6T3tDL#EjjST3cM%ZF*jW``t z9-JC+I%me%Sujem)8S9aRVB>TW6neA8gnc*YD5LW5aYb17=nO-Q<7o`0tU`DiXjMc z=A#SHADlL@#%#h_MPJ~|OaC0Pgvig=X;$Yv2uw4Eg0MEv0xl;^M2Rb!C&5dDhZ81C z{Ku?knR5m>yc$+_vQce2Tup(IyrzE_K5^2?UDqy6!y?z+nP|(iQcCSCCNQ6bz#LPqs0pl(R&tRhrZTaZ2{kVRbRYT=5P_g=gdoIq|6w5&YhRT2V@6I&kIzYyUWj@O?nAJ8lGWE3=^)$HOdJPj=WJ% zZJx1a`fRW|d1~skxF&l!xN^562&VF2n;{4oxB^oef`Bp9W(WdCh0PEI`QmfHxj2S; z&cy}}h3Dcqh$xAvBr|R)6DTwx&@RY@A;fu1U<8F&#soTT&nk6Z$AaCn&c>md*k(*@ zf?%65u?d20#>6HFwiy$fYP>y!)kZ$)Q>Wvr=e|x+>J(?bW=~@}W7!kFYhBO@Or6`iox0|d zJ`Xoj>%U4tGUU2m=5WJ24;t)wFsP676K5-T9ypP!>^bwmxo9(EoJh?dkd4@kaTK!vz~iAE-zarDxQJ$ydD?(cJQf}`jF|qq~7l>i(S~ee;#L_EWHL&Oj%^nO11*$`HMMe zCEGNCxo;)gHGw624+0Y63IdO0Hua*^HSnj^!#`dk@mW0og>EF^*012WFFG#yCvPACygy8RLkrs&Q^4)TB73X9AbB zM!9y)SPEV1DkiJ2o^eZf=`6)3&YxGxWsjNWZ)IJpIx!01Z zz#)u@5xWEoGc~ifs@$r^Iw9W8iYlY9x~R9Rn%Z`Cm{gfoimp-_ZnuvXWbwPlG2He=lDVsF%Ytc*v{ zwb7v#wT0#-Be579D=mi9Ua20`2(}C(Xx@o4816DR@gaF7{0uEgUWG&F7+ywXOwU9v zp&ChJ5eWv#I#dR8QpBDA434>pRjp&zcR{4D0f-I4Ww+X33@OX8Yr*aaqn&fEH3oNp)w0|cwdLUP&8&FBa6A4$Im<)G#1JR6#1ZQ?`nU(hzj zQ?aH>bGAF2sOH>cbI_ZRzb22;Fc}P2pWzA&`F)9FxrKFyAb`z_Vcr$#p=_iq$wsR0 z|2>2Ad~?13SDiJKR{q*b)J6Jqg~w1 zOLBvJfz9uL=I{(lVij=GZ)x&2aL5zGxfS`t1|*VzP1i8CAhRQ5C2waf%|Smb%yECk1)sOr4irDdVF74gF-$JBv$o&iX;Vc|rXZh8~`K?XdB8l@i_B)kl@#7ai`PGys zbrXl5{_N*f?dROyeqQV4#{)kx+boxwKe-DXI=(MQUW5Z@Ju7z{{OFoH88HmtF)%kV zH|c}H&C7sEMVtrZnDqw7uv?PN5?%$Xc}LV;yX#?RAot}hD0A)Nijr%W56L^wR%%xj z`eHinx1 z)+XWX;V`0R>@FP3ju~ps$Ou-ul7Z0Pc0$9Yob$kAJh+lw_*S)C&Ur*FJKaj&&8BrN zJKW9Z=l1P)Z2lf-4$rWJH^aG>?*#|7JVyGGTg#3qD|sJlX_r_7xt2MwoLU~tIeACy zcsd(7C$1RLzoQVT)N}uO)iSr>rvzNf;#vIo#ZOKx4`Dy=YCkCMo_^lz<;SjNr$hea zUUUex+}qJt)G~T&*D{a)P>$h`I)+sogSCkd$@^hft)Ccw;XDA&SB^iMP3FN4^7AK- z`$2AhylebtfNPJxht|V)1^fO``(CYl^C9b7)&Gy!F)zw)Cx3RFoB$`Ao6t_C;7TCJ ztoK>^5ZVpTuq1}1rJ7gMYIptfT&_e67$?W_=H^^OA7l-&Bx}ey52;$l^p;w73?(0i zce|Dy?&d_U`9HAvMP8gUCe`n8+v+gLk+uRCcuDJe| zjf*AOxOAcNI(-V_LXk((pXsU#~@N!!cc=|zD1 zHXCh_;z&BI^S2Q#Ewl5RIJoU#Oz=e1NrY*3$eddZe;DdWx>)<`?Cr0l zmp`8OwRU&7bo|L*p@W$BlD$40>e(+o--J(8RwP}jeIi&MZ$4n5EcQmcHGz_1-^7QZ zs7>a<35L0hLwOLcKz?S7D8(8)N%ao;JAMWsdBPU=Z${FC1 zwdwnzmYD=ku9t&6{9=kVa)^iDE0AMGAF*Nyy(E{b)ASLeCG-jUxL6-?QEI{I z6F6i}&vANOp%Hr#(T-%~B}OIyc^Sy2-!S!0p48=vJ{$Z7?{|l9`FwX0+ zCF?v!ma>nu``i0qj%yvI+6co*US6(oyh8d4crK~hTyoyKk~-tH7zvJ~v4+U`WIi%s zZkh)u_ok>POnleviggKVi0SliIT?<=Zv-^J=Z0zO}`Gqne%!MEY>+0So_FTly&qC zd4Ub_e1lEh0Y{SLtb&Yti<93KwwfAEbR3HrnrHdkol&Q1&K?l%PkLlkGm_*LxXg!o&Ed-QK;FALKn_Y!Eq|%tgI&U?b(}C z=xSZL4&F|Z`J1%uI#!gwET8jUv)bGwoFgFI^~GK3Avz2d*W^W{(z1_8vwZf^$COmo z*K&xM);*`BlCE<}Yttsq`I!`0+595$t2yEJ(Mdc?0C`9F>)8a~ZNxZ^Y)f?yfq6_A z>xjIEV&OT%MXdfdG(≠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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..a60b21835d5ff0b8baf4289d4b3d0e5837827b83 GIT binary patch literal 26112 zcmeHwe|%KsmG`-KX72n*GLuZgZ_o(@7?TjgPlF;PB!IE}(gZXXg&`RrlH|sj1VKd; zMXV^RZMAA^TR>||tyZdSwW}2?wY9A+zT1A@vTa#(EiLxlZT)ojRoX4S-*cYl-no-R zwEOS7W9QuS>pAB<=Q+=hd+&sYccS!6__gw9 zjpeVEw{GdoCVDgW=1i(P(Vpt*vHKDm(}_%fPolFY(X^^1(QS96Yl?~@725RbB}B^& zAFX`n?bD986ErzdVAK*_1CFJ*Z{CD!0^b3AiHZd`Rou+r_~mmL5PbglXv6KS%Kyt< zHOVY|?t$G^j0_O{7bjxqXCF}^czrh#wGNe?jZP4SJn|6eOFVQ{vme%@c5w37iLT1?+BVtttsH~vs{4C@MzFnq=Rl6oLI~E}%krNB}IL6T%#>X>`4lq7}afHqIM8?sG@kxwB z(V|Kj2a~4Yijga!n~`q6%3mR|0c(IciZ8j2j7B5Q_gWnjCC`Dq(Kg1h%E2)XE)Kgc zj`X=W^6ujB;o?YT6`_`LSuS!CA_y{s`cN4X1PoM)Vh92TGNTxRNUbeLyzrl2YYVbf z=p)K2fj-#foD&eZMr`Cnh{;S$)dZLkdpZ-649>$G*d0=L(@|<{BPljOu#KeH0Kqnr zVx#iyYy}9^9o$>&M2ZmFmOV`qP_WpeNWir0Bomd7>5AkOXp}pzQSP=UgQ$Cz4ndF~ zREuH=0tP04Vh92TYDh5zK_7X(at<+WLvwfm!a~~4Ltyp{;G9ELNyI*16G(Ezo~emy zCT277VL4>BxF#$Ws;SD-l zoCGrqL1ZWQ){{8Qew775kQPiQ#SjDxtObf82pE`TiXjLXn4XFuh~%*ic|^_U=dn4v z1YD#J{fgN0Spx*hD`H=yiMdQ%tciI{U zq}T+(Hj`o#1lvrCO|?$=Xc_GBCtC**vW$zxkxF7OWCB14>>w70EyO}5z!9RJ3HU?) zzoGNbxzs3U(Hy;#bB7CO%rhETvs5MpL29u;DTW|mV3|`4LBPOTrx=2OfyGKO1Oek* zhat%LEP{>PfIf1)Z^AV=bez^^*Psg+8ssTrUk04V3Ehg=t2BY6MeJrxEM@|k6SYPr zKBkE#CRQ+^2aSEU!Y6;Y8aT(RA-9(T=dxbO1Z)X$2@?Q9K*M5}LR`uOfDo9p7P~~k z&*&_3{xr&oGLz7W?Bo<_E++=seFbnHFJv-e zV;%~Daf{d=*8~zCvDa$?!yBac1^S}k=6tTEn;uh1j-{~U(JMfF7_iflVi)B zPqtu^aU4mB0|dvBlsG_e97%}-1jmt-I6!b5Nr?jl$B~pcKyVyMi30@3k(4-``FkT` z;7@ifL?|a*EY673$(2k12yqn?2up}{On@WAHB2BzAvQ1pu@D=XfIlHRn1HSjo0vdX zP=dLQozzr2M_*mR<+|F)Orkigo!D0V=)eT*wdgp7Ifq#|jzq}3k%fFlvv`mq1yy6> zMiOyE3dsub9%S)&MTo#gM3EUMj>qE0nb9yZfd?-_zqX31C=5-bn8#-vRa{IlxDkI} z#1)Mle?A)>k^Dxg$NTIpE>YyOI~}6R7+ny=N!BW?N)HRLsA_iHCjplFsl?9*14~)8 zuZ4lqKuMswm@G&TkrO+ii3EQH!Ta)qFRY?arH=hls^61~{cXfvz_AYtB2xDRWO0%> z3dqx|8Kpr_NJ-3_NOjg{ci~!uAi9}O1nq=G?Qna*J!5F``szkcV%Q$$IJzjg5_?lT zxnenHIOLK(mRA{Lkio)GbpZt>38ntyQ#e@8z=g}+fB$_Xf%1}2R_d=pGLbPghNX1) zpPW4S==11nq0GB6whbG@^HES$>sF1AI~NH_7tffZ&lpAFYD`(h7;~kz;Fi-5hLw{q zi3Q1uSU5zN`b+%P7L}C-swR3W)v|jz3`_McfY1X7UB^CwF22%<-6Yg56^%TGRWl_mm-zH__r|BDyRMZPRNtMem7gO%Om-A&F0$%U zpN%n$6rjF&@}izGxp1Q$qO!ueN6}(f+KQ?&@UKJmn3_?BMJX4*tPL~fgcS1b<7{dzdZ{FYU&fR{h+bs-n0?(ywvf%EjZOnR(pvz~5w(dn<6*Kz6Z7#sT< z#&viF@Vr(P;FG5bA&D+;UURsZ*UAFVYe~JH*PcLpNi3!#&1-kWE&C=8!;)TM&VR_f zE|uXL8goSEHOI{BpUNdl+B2^a6VGc-ou1bcv7XnSh}8sg*TkXox{UqndF|=LPB_c+ ztLOC)70hc7=VtDBNX3+!*RFzn3-{ox^SVmrwX^16Lw93i2|u5)EPH@ss|G5o8*-v! z8=`{PJe)xl+dR%!E;d)e#=IU9o7($%K8=?8vTuWm%ygblyFi?EKIKf`4plXub_2r_ z;LDkk`BWo)5%XK2!Sl&$UgnePufsn3eBw^(`E&={)AI?n;;e8VG@nf3^$mAlSl>Q@ zrV&r5-t}#0=lD3IJBRt4>(9{jjU%(~gkg9=6Nyf*Z=UFIX5!<_i0d1l{l@0v!)(uw zMVCZuwC}>X08k#Bm^eW_NqSXXso^>dfBavp)?z z@0q<$!gjblkb2JSIFq}{V0#NhSy)@4nRh1VUOH!T?&5`;-7~qTm&4EG`<{0Cspb|Q zG2pB+#=Z|WxK8u?tIp)A5`6MREM#*R^5zyZFt?Nio?DV~J-0l;_>zmEIl|m>eOmVY z9EN2}?>=(g(-10>H0dvdQ9~10f@7}kp2)fGB=q~$y`VSrQVXX*%eg-vNA@S2 zIbag*c=^4HtkL;did4*s$Ree&5~;YI<}#6cj{ z)gikBjY`ohPcXwbx++>?LG7zhOFquJ8K3>N4{Dqz7}EF&Zamj#Kgo^V>MalP13CD0 z+4{!80*$mP>;u++bw`Hcu1%#ssE`urwE6+>OX*0-m={ z1wCDAN3!WT7CZNt0cZ>x{-V0qz{M8H6(GlA9t)?noO*L(!ED_(LuTUo89RJ7MkCi? zlh1yNEm?6Zc?d}L8k|Mfq2mQgu{5Y{#Dn>!K1s2?Q#wyN)u9_*R&`rTCyEV8Bj*rvmXeagG4|6iF+5#rFI2O| zCr`0et>*28oG|Q#%7QbxGxT2QiN%-P0?iTj!Ww6WTJ|#>h9w>R@N*`fGszm}wwD>M z&Y2uDpEK2Ht^k#LK85v<_d?F1UcF?>>%Gtu@rUe%mF!>dg>DR%{Y^N_^Q-R_hp1pL z^l-k#9aqbd=U&lOu)obc$h(hK?;U=FF~m8&B#X@wx%KTlAIT)^M!q-?0z-HXScj;b z*-#2q>x_ks(#k#yyZj@CssbI(C?&+6X=T5|!Z3tRtbANXOKcEU_8(b@nyD%ZmYwmH zS|wI>T=@;k-I)D66ez^9U`f!Ch2$x({Q}FvEDM$3siA5YmeZvDU6v`1u7TVGdU^kf z2Y1{(`$Z_8F)A;Y=YT_)yuVbS%Q#Jx_~c}w8y!ZY2sXJMX$*v?;rhzOEtf7f^e>y$Mu^n2hC z)0AavnwxNa5A;5yamwN@p6K$y+Gboa=0G?c1^E|aHsA2`f`xM$p#ljVB&3-TozRDI z{TsgMkNj3>2CkRm%j+Yz!}A)sGLAvP=jRc|F;eumU~!>ETS5#ggMTZCQ3JYY(XGKp zLKdwGT~%Pw@gT#`34B)IB;jur{9TLN-V{0=u_zp67!NZ1A@B&zh&)*s!NflWogY|# zgPqmz5~YpdGlfz5a-^XsPFK*oc%D0{;9*3UfPR!#iSz+TBlK^fCkx}W8#)&4pwp2k z{UyY0FBWMuatinbqJN!m{uF)^z7|5$q8^L&i$uCYq^894baX>el%@)QBluBzqTpvm z7TquUF9&{Bw4VM?0Y7DaHJpI-e}NOFUkTnT_;$hf3;qqkZxMWt;GY(JKX8k7OJ-gG zjM9(MM~k`&IJQ3q7-kUXXnHH~95U04KJw?&0;S@xH2>DRw{R}T4cE(~lN2ns)$FXK8_M^fEJi|{2wcBE<1ogwR z-xM%4it2>gFVuKiD%AIdO5j&EtodZYtY`zBhx%vgNI+4xQ2!)UC2bSxI-#m)r%(rk zs-|5+4G1-Z?h@)gp=t=fCPe?ZN*hq`58@1UYhhhr8hs(O0Gs#!HWmTCX)b`qJ^sak z5~>R<0q1RBGvMcZmjT}DYXf}UmjZm+*9o}AcO9T=`@F$zC;1q*i5-}u`O9GW;OIj@wm=OK#ezq{j$G(#O z`v46ew{7!36ey=H=+W7sMc;`$5?Gz!a@jrhT~rX-y3~`flyRx2LEY+7Ec=vDC&QzS z>1g*^p$0>f46d|CwCqycDVX%QmaVgjK|P~okH^kOtvxT)?$9%_3qbu)sL#-0>$!lR z%E}3!-E_b@90<@dMTK@pUI|##uPBMyqC2&0P4vf*eNs~$(Vv6*tfn3)Ivxnp0Zkn! z`W>jpHFa&_JAn{At*LE=e*yKprp8D8R+x@xYFe}i)N7i0qG*g2pL#FkZuv`WVpC^I^OKS4ahkg_(1~u7f zhnJ2qs?@TR{$fybgyK(a7MM1P8>yxWE1I9si; zbW|v=o{wAOs2DeHhz!+}vc}WL6eZ&@o~{*2#W|ibLa8{%6aR>V^Z7LLIe~7|vR9DL z33RuX9YfA0(tSeh4sp&V(&x2oabP;u%r9x#8qAwX^rV)}E0|8_(6_Ygk^%$NVWGGW zo2_#xiCaH418l3DwkryK*k(SVaWsN!b_xP2iS49&tCIGMsioebY> zyo>TE(XzV?%a}srwX7QBP(hQm>>`Xq1yyO;n=vw`(rhjJbF3KD0xkPlvKZNM+D+0Hp}4mR7rcatR6P2=zc9*ft9F=zMy3{Lsm_XY1v(nRnynC>?-7C27O!0x{#L{bXd!} zV$-RHeyC;JVg{(!wXCS%eC#d9v}{zt1)$#4vd>4S7`61amVG5U2h^Xn>>w7}nekREHY{Ro4$$bLmAz zNlnb99}0EScqH~k$c}32&;EnfJo=?avyR@#qu$e+55%6b>SzmY0T7vSN9;LJ6?{kp z6^nh}noreyR0K5;d(FCtey^zm)@#Z@eqK>&rHV}KyT1AO@iaKDuXI)17gi;<_=vgg$ zAeIQWQ1SxDW+kX!YAP1HAlOQW>l~Z)!L@Xgocd212dw(wmGoblIu7b8y7fZVR36sR zgFJ^1L3vQxNgQAXu+CujVwVS>f_+0Q>+Oe2r%HLMHRjAvr zIzJlRN)KqNlD-=3qOWP{8hR?ocOM2l7#a${6Jd^m!=)dU!x81|jBL%(Q8quSU#Hba z)mMGYZ}m}ok)NNOM`g{i`PYEcQ-{Nv9|c!={wSIsMd$3+&My5R`)6-;cInw|8uZf` z=goluT7o;DW(raYcfo0VoAIl>>+o&HedX==HshCPpTxHrr>-yI+l({SH*t1)0cWIF zaUysf_dv(+HtP*4rBi74E_U=1Knr)$?-oRGr}J(>G0hY>Utohk+_!;$nZP!IDL}qk zeYao~?FXEI=jzNkNW5+5 zqQDA))dJ@Te8)I9VADIsUaKGdU@xzuFI9kiS_F`PbKpWKJUyo_(U|{;PcIVgHJLI zqS;{Zd8EPM6H9}^XQ2jzPfHC3pM4q(KIP0bUWtt{+9b9%gHIQ2u*r~51#JfJ|7`~E z^lb+3>1_t@-fae-CsN`iB{8QAK8vK_g(06WQU;$SQU;$HQU;$6QU;#`QU>q%O_Gxe zI#saASWX*a+rfFz*a`fF*lmVke%8VrkHMpJ%9vEV-?-D@F#-p9J7wHh^q6tV@E0Ej ze>5U#rMp768LjlY=yv0E8M_LxRzZJ?yk}Ib#eSFA?-I*>;*vIBiDbK4bgCtWYKfs*Vz^tZ%@J$&iM6{$^FFcms#MFX zQZ1*9FBd*$%n|9s(yB~aJu0mp7XG8s>X`UFW>CR-#@8gzUz0q~G>(L>@gFlj1O80o zp9SY?JSMeq3^lXY|BUEABl>L;d6`%)lgP^?@-m71dBpIxzr;Kp{geNQ;6D+F>O!ri z44#Q8nHMRP1iB7z3f%x$Mb84xre6SFL?-|n@vN+d zJ|=veZ$gdqaViftV&y9jFA-}g;iPCQ%?h^*-Y(L1{HAkRcu+WlBE3!U+eCUBq&?x= z#lk+}@7Iv+Jc2uvYCw+mO9Bsz^d;ca!Y_;TW#NBc;0ckwp&?uNt?Mat)bNFL;B7%t;BJ z@-aRr_@LnX1>Z0DOM<^7_#1-1A^2N9&MNuEuZH4R@Nx~suiyW3^{bANg2wpF+NjMt>9}u`pIQs-YEbxTDw}ej-@hGqY zZ)V_8;9=n$5&VSUR3IJ;#G~N#0-J=hLGS^A`vg8J{KJBu5crmGs8Bo#tQXjXw-3|8 z8w4K^xJx+u1V1eBh;U8_PDMNle!SN}-vzG+tPT$d+$S(mIvL|wFK~mva;)T?^fWz3 zf1r1;hb}YjFdjEvGycW+cjJsP)m&t*F*lpr%mMQ*^Q-1h&EK1UH4A)meV6$*`)=^< z@!jux(Rb4Ke|_)!&hu~a@Ap6BKjQzHe;S^<;yE_X#X%~-iMSA_+7hhkqd`ps#gEwT zH@+1l+F*SL@Y&dR0ry0{2l%Pz4*(x4ItqA0;W5C<=$nAwEBXUqs_;Jm%Zj=+qfER%>anDcyPBEZ~oE8C(1De>WaY)5!JqCOf zBnGmLSMzwjSqgkCApbqjDB$A(O*~H=1DF8MpmIPHJLUx7QvmrrCBLzm3TWcV+_}J~ z1Dg07>2knoXc>6+H3fJLv*(4>0eH%<+JCN{&t~F;y9{tGY#4YK*bMwi*uc9C zK$EV54Fjiz6~NcQhCx>Yn)rtfE(5+E(4-C20z3t1(neYXydBWQKU{DH@HC)_znW|V zz8TP@YhiB@da(k&KaLj1X}!^Fykd+tCz%J#SInut8NRRkzU>?5FZZwUKj?qM9|?>N z_y_oY)B9P7J5bBRI6rW`koj7t@K}Fn%l|B5UVhtMBk-QXTS$J(TPpAv{U_qS5#QVJ zy$jz@zg{Wy`Vo0EX=Q&`S88Kddc#a=UeeRwoz7@#d1tl{%;9!s(bE2&_6@UWZK|t3 z-P+%a#i|cI7vUE>6)7ehV%^k`` zhcc_E6-WnC0U7(sQS4?(&*sh^N8}Pi!qhE2fonf1EG>44hK>$e;88{=7H(a?esQXO zD}FMtv@_iWx!a@RqUMg_JU8m$A}8wM5>E^x*>nOP-f%T)>3TaeLL94+=JfCeSJ;`Y zOSbo75Yjy($yJOiQ{5x9ZAtfZq%$MS8tv|0y9b3ZvbZVLmu}3Y0f&dQq&wBwHJshj z-#wgpS%0dlb5mz~iYs}zSSLR_T%!6lf?!n!eHwx98IlpCYD7j7IC&UBrebh2HG)P< zU#hQvB!2(KYcYj}cZ>7tMmk*FX!rMw(5lhSj=)`PckCE$f;}{)yE?a}GsC4k{hSh% zIqMS3(tWKvdee({V4X>KHS-#>Db=2qNiU_T)VWC2LeP`#OQ9kO4VxW&eW!!5qx{m9 z_Cr|fvvz+5Hn2?cVxd=7YIf#i&nDaD$+)|eo5OU*;pMH))T~C_5jMM{=x}l?Gd1%{ zZ)bUxCjRGGYQGwFwiF$kP zJ6b#Yyf#`>8KiD0{uQehwO9zStPB@6qi{0avgV|^K2Qt$=cdlh{Tb2A z8Btjf=H=I`<|_P(6J={N7o__w8U0;dIAPW9}_3G_${zpry+XIE#R zN4j{29^p$;SveTcHa;HE(yr9zA+=JYJBeM8)bHoW?p?o37Vu2#mQ>HG%#!P{6f<`@ zHf=9UPd=IVy5<&l_H@9MVtFQG9$zM89>+5&^Z05i=Chn-H;=2AfpjX{5FdRjeCr1jN>3H=u-O4IQr?Ta+j5*8M|8u z?Col0!?oFMD>Gxs_P%rvPeW16+wY}GKF3+&(wp=VlUCZfVA35+wzsEy`K&-#$5I?= z3knhImA22TTdPf;oKiC%|JL;KoOfo$^3I;?NK%Xis+UheJ?%SIq4 z0UWBSrk$YFJ6CvRWrw(wS}853}wP?K0GYr>9U>GNVJzN>W^c z$5<7N5;(ZCmhfE9(u&UZjGeVN^}%&Vx}hi4wIkb^C7IHYx_1PeGby@kjkl~RY1b2l}I;tW( zOx9HAPBkUv2&$@GvoB9~+uPC&eY8qWp?U@@oR1$Z>U7H0FZ;@>OjCMOs=up`mUd>c zeK}I~PG*U^u@qAnv)mb0V#w!wKrZBXAxp1VY3$EraQmTfKK6()S4pzkaB-*#ltO8grU+Xds(vM33{GL9N&Avr0#-EbM$ zDP?|POP2OH1lt)VnzKAPv7vVNf|AcGcPt(Iy#wD|@l^M=`s4rb{d>uuFpQ8dK}G;b zNePotLFWrx5eS-QybKDg6vem57c@*(D>AL9H7b6!5ie7hT6L*VmxQ_`)umeOjKvd+ z_`vBvt%+Bp!H5|jcp+XV*H_~U6ZA_ax?$xdBc6yS6sbDj9hSx~8Tj?3R`4hAxQ8=bO30}>E~qulA!bZJ z8D6GAFt=6DzkR8I>!99L621a&0Jrw1Yi3@L7zfgPlr_d+IX#Ma!A|7RXo*J1+}r9 zrq>hZ0RE@jVmiV(XgotVm82pVaV;g9dt|_T7io=2&jw z0$0Y%Zy{X_4u%y+Nc03hqQQrk-2kr|lklT?th@0wOvKk#!V>!)qbqzV>ysSyi)?{5 zOD8VE+{?`B_`v6d+Rqfm@Cl{zgfI_1}s>;QK+y_{uun z@lHpl&CzL#54^@Yd}W=s_!=e$2ID(J>N@a?LTwMsfnV@?tyUBl+v_UqjSu`rnt72s zUB&&b;{N!+Z$;6IeBM<&T_=V_O|x&6=05BR^e z^{?jk^Vvq@h3nSfG@D&_^xmV-9DV-ivqxW8*Obm~?X!E=9ew2WJ6`|f(L+a{DqnZ> zz|k+R%O!tgH1FnOoxSl|n8E|Nbv@}m44o?=aJ$3|+oq+!*`r5MP(pY<-m_ex0i@zl|ueLntq|607+T@SbfZ;V^; zhIkd;D6hwLCEnq#63rL|h!v2wNYM_uJ7@u2+p@*MGgnm`z^n!;aUF2%1ey6~pB znR@W1*cP=4Y1Im83fwH@De8ls4N85U!attHHd?^XK!T@7BUt)192@Ah^WPl2aYhdC zCVVXTjj-2Ez2ajBdXxf{7V|40>BBbzP4?XbYB{`Qac!1195HLN1i2G?PEVS^&*D8e z$JGmYF7ChAZY@@C!|m5v*v-Il&fZM?_Mq1NavT$(&zbBK-5$i=<>}eq=f4JT@w@OJ z|9b=`>@J7R&0>)=*Nb0Sa}PJu7Rf;ZdK<+5D$VCnVgF8Em{J-3@5Z6VZ8hxMh^-$v z?(_7H@T-EqZ`^K`-(ck18=B=@j;j!V8h+aW+wq%>nKTdI`S@K%3cvN34Q?I&n+?1J zSLVzF)`4pZSQ;(rM0*a#tWMe>Wx#lh8!)a}=yan(yO3G_OW*v_&c(rF?)mhp|IdiG O7I=97gZ_V$f&T}v76=>w literal 0 HcmV?d00001 diff --git a/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs new file mode 100644 index 0000000..ec4e73f --- /dev/null +++ b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Logging; +using MotorPlantContracts.BindingModels; +using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.StoragesContracts; +using MotorPlantDataModels; +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization.Json; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantBusinessLogic.BusinessLogic +{ + public class BackUpLogic : IBackUpLogic + { + private readonly ILogger _logger; + private readonly IBackUpInfo _backUpInfo; + public BackUpLogic(ILogger 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/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..e9b2332 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..992e7eb --- /dev/null +++ b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..742f6c6 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs index a940c2a..c9a7897 100644 --- a/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs +++ b/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,6 @@ namespace MotorPlantContracts.BindingModels public string Subject { get; set; } = string.Empty; public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } + public int Id => throw new NotImplementedException(); } } diff --git a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..1101056 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using MotorPlantContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..3ee20ed --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs @@ -0,0 +1,58 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..1021b53 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..24e7a7b --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..8a13157 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,56 @@ +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 MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..c045c9f --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..1911d22 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs index 23522b8..256d063 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs @@ -1,16 +1,18 @@ using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs index acac773..06d4e46 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs @@ -1,14 +1,16 @@ using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class ComponentViewModel : IComponentModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название компонента")] + [Column(title: "Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 150)] public double Cost { get; set; } } diff --git a/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs index 35c6a94..10c1e01 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs @@ -1,15 +1,18 @@ using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class EngineViewModel : IEngineModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название изделия")] + [Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string EngineName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 70)] public double Price { get; set; } + [Column(visible: false)] public Dictionary EngineComponents { get; diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs index ea49efc..4774970 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs @@ -5,19 +5,21 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО исполнителя")] + [Column(title: "ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Стаж работы")] + [Column(title: "Стаж работы", width: 60)] public int WorkExperience { get; set; } = 0; - [DisplayName("Квалификация")] + [Column(title: "Квалификация", width: 60)] public int Qualification { get; set; } = 0; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 100)] public string Password { get; set; } = string.Empty; } } diff --git a/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs index 8d81661..a66a392 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs @@ -5,20 +5,25 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { + [Column(visible: false)] + public int Id { get; set; } + [Column(visible: false)] public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] public int? ClientId { get; set; } - [DisplayName("Отправитель")] + [Column(title: "Отправитель", width: 150)] public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] + [Column(title: "Дата письма", width: 120)] public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] + [Column(title: "Заголовок", width: 120)] public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] + [Column(title: "Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; } } diff --git a/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs index 0ff8575..e0988e8 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs @@ -1,31 +1,35 @@ using MotorPlantDataModels.Enums; using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] + [Column(title: "Номер", width: 90)] public int Id { get; set; } + [Column(visible: false)] public int EngineId { get; set; } + [Column(visible: false)] public int ClientId { get; set; } + [Column(visible: false)] public int? ImplementerId { get; set; } = null; - [DisplayName("Клиент")] + [Column(title: "Клиент", width: 190)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Двигатель")] + [Column(title: "Двигатель", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string EngineName { get; set; } = string.Empty; - [DisplayName("Исполнитель")] + [Column(title: "Исполнитель", width: 150)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Количество")] + [Column(title: "Количество", width: 100)] public int Count { get; set; } - [DisplayName("Сумма")] + [Column(title: "Сумма", width: 120)] public double Sum { get; set; } - [DisplayName("Статус")] + [Column(title: "Статус", width: 70)] public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] + [Column(title: "Дата создания", width: 120)] public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] + [Column(title: "Дата выполнения", width: 120)] public DateTime? DateImplement { get; set; } } diff --git a/MotorPlant/MotorPlantDataModels/IImplementerModel.cs b/MotorPlant/MotorPlantDataModels/IImplementerModel.cs index 6e6064c..6963379 100644 --- a/MotorPlant/MotorPlantDataModels/IImplementerModel.cs +++ b/MotorPlant/MotorPlantDataModels/IImplementerModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MotorPlantDataModels { - public interface IImplementerModel + public interface IImplementerModel : IId { string ImplementerFIO { get; } string Password { get; } diff --git a/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs b/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs index 464672c..84a5a77 100644 --- a/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs +++ b/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MotorPlantDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs new file mode 100644 index 0000000..424b9e9 --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs @@ -0,0 +1,31 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new MotorPlantDataBase(); + 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/MotorPlant/MotorPlantDatabaseImplement/Client.cs b/MotorPlant/MotorPlantDatabaseImplement/Client.cs index 715dec8..5af4118 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Client.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Client.cs @@ -6,20 +6,26 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace MotorPlantDatabaseImplement.Models { - public class Client : IClientModel - { - public int Id { get; private set; } - [Required] - public string ClientFIO { get; set; } = string.Empty; - [Required] - public string Email { get; set; } = string.Empty; - [Required] - public string Password { get; set; } = string.Empty; + [DataContract] + public class Client : IClientModel + { + [DataMember] + public int Id { get; private set; } + [DataMember] + [Required] + public string ClientFIO { get; set; } = string.Empty; + [DataMember] + [Required] + public string Email { get; set; } = string.Empty; + [DataMember] + [Required] + public string Password { get; set; } = string.Empty; [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); public static Client? Create(ClientBindingModel model) diff --git a/MotorPlant/MotorPlantDatabaseImplement/Component.cs b/MotorPlant/MotorPlantDatabaseImplement/Component.cs index 2382ad7..461284a 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Component.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Component.cs @@ -3,14 +3,19 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } + [DataMember] [Required] public string ComponentName { get; private set; } = string.Empty; + [DataMember] [Required] public double Cost { get; set; } [ForeignKey("ComponentId")] diff --git a/MotorPlant/MotorPlantDatabaseImplement/Engine.cs b/MotorPlant/MotorPlantDatabaseImplement/Engine.cs index 8a51aae..9a7b9f7 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Engine.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Engine.cs @@ -3,18 +3,23 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Engine : IEngineModel { + [DataMember] public int Id { get; set; } + [DataMember] [Required] public string EngineName { get; set; } = string.Empty; + [DataMember] [Required] public double Price { get; set; } - private Dictionary? _EngineComponents = - null; + private Dictionary? _EngineComponents = null; + [DataMember] [NotMapped] public Dictionary EngineComponents { diff --git a/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs new file mode 100644 index 0000000..2e711fe --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantDatabaseImplement.Implements; + +namespace MotorPlantDatabaseImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 3; + 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/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs b/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs index cac72c1..fac030c 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs @@ -8,18 +8,25 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [DataMember] [Required] public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] [Required] public string Password { get; set; } = string.Empty; + [DataMember] [Required] public int Qualification { get; set; } = 0; + [DataMember] [Required] public int WorkExperience { get; set; } = 0; [ForeignKey("ImplementerId")] diff --git a/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs b/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs index 0a9bc4b..ae2e364 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs @@ -4,7 +4,9 @@ using MotorPlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; @@ -12,12 +14,25 @@ namespace MotorPlantDatabaseImplement.Models { public class MessageInfo : IMessageInfoModel { + [NotMapped] + public int Id { get; private set; } + [DataMember] [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [DataMember] + [Required] public string SenderName { get; private set; } = string.Empty; + [DataMember] + [Required] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] + [Required] public string Subject { get; private set; } = string.Empty; + [DataMember] + [Required] public string Body { get; private set; } = string.Empty; public Client? Client { get; private set; } public static MessageInfo? Create(MotorPlantDataBase context, MessageInfoBindingModel model) diff --git a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj index 9416c52..c8f460d 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj +++ b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/MotorPlant/MotorPlantDatabaseImplement/Order.cs b/MotorPlant/MotorPlantDatabaseImplement/Order.cs index d6416ea..93c61eb 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Order.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Order.cs @@ -3,27 +3,38 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Enums; using MotorPlantDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int Id { get; private set; } + [DataMember] [Required] public int Count { get; private set; } + [DataMember] [Required] public double Sum { get; private set; } + [DataMember] [Required] public OrderStatus Status { get; private set; } + [DataMember] [Required] public DateTime DateCreate { get; private set; } + [DataMember] public DateTime? DateImplement { get; private set; } + [DataMember] [Required] public int EngineId { get; private set; } public virtual Engine Engine { get; private set; } + [DataMember] [Required] public int ClientId { get; private set; } public virtual Client Client { get; private set; } + [DataMember] public int? ImplementerId { get; private set; } = null; public virtual Implementer? Implementer { get; private set; } public static Order? Create(MotorPlantDataBase context, OrderBindingModel model) diff --git a/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs new file mode 100644 index 0000000..53ecfd7 --- /dev/null +++ b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs @@ -0,0 +1,41 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + private readonly DataFileSingleton source; + private readonly PropertyInfo[] sourceProperties; + public BackUpInfo() + { + source = DataFileSingleton.GetInstance(); + sourceProperties = source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); + } + public List? GetList() where T : class, new() + { + var requredType = typeof(T); + return (List?)sourceProperties.FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == requredType) + ?.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/MotorPlant/MotorPlantFileImplement/Client.cs b/MotorPlant/MotorPlantFileImplement/Client.cs index 660f75d..bd61cb6 100644 --- a/MotorPlant/MotorPlantFileImplement/Client.cs +++ b/MotorPlant/MotorPlantFileImplement/Client.cs @@ -9,14 +9,20 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace MotorPlantFileImplement.Models { + [DataContract] public class Client : IClientModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ClientFIO { get; private set; } = string.Empty; + [DataMember] public string Email { get; set; } = string.Empty; + [DataMember] public string Password { get; set; } = string.Empty; public static Client? Create(ClientBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/Component.cs b/MotorPlant/MotorPlantFileImplement/Component.cs index 5f29da5..0a39581 100644 --- a/MotorPlant/MotorPlantFileImplement/Component.cs +++ b/MotorPlant/MotorPlantFileImplement/Component.cs @@ -1,14 +1,19 @@ using MotorPlantContracts.BindingModels; using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ComponentName { get; private set; } = string.Empty; + [DataMember] public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/Engine.cs b/MotorPlant/MotorPlantFileImplement/Engine.cs index 5f283a5..9088e6b 100644 --- a/MotorPlant/MotorPlantFileImplement/Engine.cs +++ b/MotorPlant/MotorPlantFileImplement/Engine.cs @@ -1,14 +1,19 @@ using MotorPlantContracts.BindingModels; using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class Engine : IEngineModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string EngineName { get; private set; } = string.Empty; + [DataMember] public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _EngineComponents = null; diff --git a/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs new file mode 100644 index 0000000..a028733 --- /dev/null +++ b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantFileImplement.Implements; + +namespace MotorPlantFileImplement +{ + public class ImplementationExtension : 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/MotorPlant/MotorPlantFileImplement/Implementer.cs b/MotorPlant/MotorPlantFileImplement/Implementer.cs index 86567e0..990694c 100644 --- a/MotorPlant/MotorPlantFileImplement/Implementer.cs +++ b/MotorPlant/MotorPlantFileImplement/Implementer.cs @@ -4,18 +4,25 @@ using MotorPlantDataModels; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] public string Password { get; set; } = string.Empty; + [DataMember] public int Qualification { get; set; } = 0; + [DataMember] public int WorkExperience { get; set; } = 0; public static Implementer? Create(ImplementerBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/MessageInfo.cs b/MotorPlant/MotorPlantFileImplement/MessageInfo.cs index fcb68a9..6bfd6bf 100644 --- a/MotorPlant/MotorPlantFileImplement/MessageInfo.cs +++ b/MotorPlant/MotorPlantFileImplement/MessageInfo.cs @@ -4,19 +4,29 @@ using MotorPlantDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { + [DataMember] + public int Id { get; private set; } + [DataMember] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [DataMember] public string SenderName { get; private set; } = string.Empty; + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] public string Subject { get; private set; } = string.Empty; + [DataMember] public string Body { get; private set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj b/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj index 4da00b3..e955e36 100644 --- a/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj +++ b/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/MotorPlant/MotorPlantFileImplement/Order.cs b/MotorPlant/MotorPlantFileImplement/Order.cs index 961251f..23b1a3f 100644 --- a/MotorPlant/MotorPlantFileImplement/Order.cs +++ b/MotorPlant/MotorPlantFileImplement/Order.cs @@ -2,20 +2,31 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Enums; using MotorPlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int EngineId { get; private set; } + [DataMember] public int ClientId { get; private set; } + [DataMember] public int? ImplementerId { get; private set; } = null; + [DataMember] public int Count { get; private set; } + [DataMember] public double Sum { get; private set; } + [DataMember] public OrderStatus Status { get; private set; } + [DataMember] public DateTime DateCreate { get; private set; } + [DataMember] public DateTime? DateImplement { get; private set; } + [DataMember] public int Id { get; private set; } public static Order? Create(OrderBindingModel? model) { diff --git a/MotorPlant/MotorPlantListImplement/BackUpInfo.cs b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs new file mode 100644 index 0000000..3a224b1 --- /dev/null +++ b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantListImplement.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/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs new file mode 100644 index 0000000..670794e --- /dev/null +++ b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantListImplement.Implements; + +namespace MotorPlantListImplement +{ + internal class ImplementationExtension : 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/MotorPlant/MotorPlantListImplement/MessageInfo.cs b/MotorPlant/MotorPlantListImplement/MessageInfo.cs index 6e96b58..08d4e75 100644 --- a/MotorPlant/MotorPlantListImplement/MessageInfo.cs +++ b/MotorPlant/MotorPlantListImplement/MessageInfo.cs @@ -17,6 +17,7 @@ namespace MotorPlantListImplement.Models public DateTime DateDelivery { get; private set; } = DateTime.Now; public string Subject { get; private set; } = string.Empty; public string Body { get; private set; } = string.Empty; + public int Id => throw new NotImplementedException(); public static MessageInfo? Create(MessageInfoBindingModel model) { if (model == null) diff --git a/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj b/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj index 4da00b3..e955e36 100644 --- a/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj +++ b/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/MotorPlant/MotorPlantView/DataGridViewExtension.cs b/MotorPlant/MotorPlantView/DataGridViewExtension.cs new file mode 100644 index 0000000..20a88f3 --- /dev/null +++ b/MotorPlant/MotorPlantView/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MotorPlantContracts.Attributes; + +namespace MotorPlantView.Forms +{ + 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; + } + } + } + } + } +} diff --git a/MotorPlant/MotorPlantView/FormClients.cs b/MotorPlant/MotorPlantView/FormClients.cs index 881caaa..83f44ce 100644 --- a/MotorPlant/MotorPlantView/FormClients.cs +++ b/MotorPlant/MotorPlantView/FormClients.cs @@ -27,19 +27,8 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["ClientFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Email"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Password"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); + DataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) { diff --git a/MotorPlant/MotorPlantView/FormComponents.cs b/MotorPlant/MotorPlantView/FormComponents.cs index 6c22176..2f7469b 100644 --- a/MotorPlant/MotorPlantView/FormComponents.cs +++ b/MotorPlant/MotorPlantView/FormComponents.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using MotorPlantContracts.BindingModels; using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.DI; namespace MotorPlantView.Forms { @@ -42,13 +43,10 @@ namespace MotorPlantView.Forms private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -56,14 +54,12 @@ namespace MotorPlantView.Forms { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) + var form = DependencyManager.Instance.Resolve(); + + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/MotorPlant/MotorPlantView/FormEngine.cs b/MotorPlant/MotorPlantView/FormEngine.cs index f58811c..291b40e 100644 --- a/MotorPlant/MotorPlantView/FormEngine.cs +++ b/MotorPlant/MotorPlantView/FormEngine.cs @@ -3,6 +3,8 @@ using MotorPlantDataModels.Models; using MotorPlantContracts.BusinessLogicsContracts; using MotorPlantContracts.SearchModels; using MotorPlantContracts.BindingModels; +using MotorPlantContracts.DI; +using MotorPlantDatabaseImplement.Models; namespace MotorPlantView.Forms { @@ -11,14 +13,14 @@ namespace MotorPlantView.Forms private readonly ILogger _logger; private readonly IEngineLogic _logic; private int? _id; - private Dictionary _productComponents; + private Dictionary _engineComponents; public int Id { set { _id = value; } } public FormEngine(ILogger logger, IEngineLogic logic) { InitializeComponent(); _logger = logger; _logic = logic; - _productComponents = new Dictionary(); + _engineComponents = new Dictionary(); } private void FormEngine_Load(object sender, EventArgs e) { @@ -35,7 +37,7 @@ namespace MotorPlantView.Forms { textBoxName.Text = view.EngineName; textBoxPrice.Text = view.Price.ToString(); - _productComponents = view.EngineComponents ?? new Dictionary(); + _engineComponents = view.EngineComponents ?? new Dictionary(); LoadData(); } } @@ -50,10 +52,10 @@ namespace MotorPlantView.Forms _logger.LogInformation("Загрузка компонент изделия"); try { - if (_productComponents != null) + if (_engineComponents != null) { dataGridView.Rows.Clear(); - foreach (var pc in _productComponents) + foreach (var pc in _engineComponents) { dataGridView.Rows.Add(new object[] { pc.Key, pc.Value.Item1.ComponentName, pc.Value.Item2 }); } @@ -67,51 +69,44 @@ namespace MotorPlantView.Forms } private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngineComponent)); - if (service is FormEngineComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { + return; + } + _logger.LogInformation("Добавление нового ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + if (_engineComponents.ContainsKey(form.Id)) + { + _engineComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _engineComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } + private void buttonUpd_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _engineComponents[id].Item2; if (form.ShowDialog() == DialogResult.OK) { if (form.ComponentModel == null) { return; } - _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count} ", form.ComponentModel.ComponentName, form.Count); - if (_productComponents.ContainsKey(form.Id)) - { - _productComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _productComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } + _logger.LogInformation("Изменение ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + _engineComponents[form.Id] = (form.ComponentModel, form.Count); LoadData(); } } } - private void buttonUpd_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormEngineComponent)); - if (service is FormEngineComponent form) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _productComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - _productComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } - } private void buttonDel_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) @@ -121,7 +116,7 @@ namespace MotorPlantView.Forms try { _logger.LogInformation("Удаление компонента: { ComponentName} - { Count}", dataGridView.SelectedRows[0].Cells[1].Value); - _productComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); + _engineComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); } catch (Exception ex) { @@ -147,7 +142,7 @@ namespace MotorPlantView.Forms MessageBox.Show("Заполните цену", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (_productComponents == null || _productComponents.Count == 0) + if (_engineComponents == null || _engineComponents.Count == 0) { MessageBox.Show("Заполните компоненты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; @@ -160,7 +155,7 @@ namespace MotorPlantView.Forms Id = _id ?? 0, EngineName = textBoxName.Text, Price = Convert.ToDouble(textBoxPrice.Text), - EngineComponents = _productComponents + EngineComponents = _engineComponents }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) @@ -186,7 +181,7 @@ namespace MotorPlantView.Forms private double CalcPrice() { double price = 0; - foreach (var elem in _productComponents) + foreach (var elem in _engineComponents) { price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2); } diff --git a/MotorPlant/MotorPlantView/FormEngines.cs b/MotorPlant/MotorPlantView/FormEngines.cs index 7e129dc..838152e 100644 --- a/MotorPlant/MotorPlantView/FormEngines.cs +++ b/MotorPlant/MotorPlantView/FormEngines.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using MotorPlantContracts.BindingModels; using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.DI; namespace MotorPlantView.Forms { @@ -24,14 +25,7 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["EngineComponents"].Visible = false; - dataGridView.Columns["EngineName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка компонентов"); } catch (Exception ex) @@ -42,13 +36,10 @@ namespace MotorPlantView.Forms private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngine)); - if (service is FormEngine form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -56,14 +47,11 @@ namespace MotorPlantView.Forms { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngine)); - if (service is FormEngine form) + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/MotorPlant/MotorPlantView/FormMain.Designer.cs b/MotorPlant/MotorPlantView/FormMain.Designer.cs index 2309e01..f525ec4 100644 --- a/MotorPlant/MotorPlantView/FormMain.Designer.cs +++ b/MotorPlant/MotorPlantView/FormMain.Designer.cs @@ -45,6 +45,7 @@ buttonOrderReady = new Button(); buttonIssuedOrder = new Button(); buttonRef = new Button(); + создатьБекапToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); toolStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); @@ -53,7 +54,7 @@ // toolStrip1 // toolStrip1.ImageScalingSize = new Size(20, 20); - toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, ReportsToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem }); + toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, ReportsToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem, создатьБекапToolStripMenuItem }); toolStrip1.Location = new Point(0, 0); toolStrip1.Name = "toolStrip1"; toolStrip1.Size = new Size(969, 25); @@ -72,14 +73,14 @@ // КомпонентыToolStripMenuItem // КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; - КомпонентыToolStripMenuItem.Size = new Size(180, 22); + КомпонентыToolStripMenuItem.Size = new Size(174, 22); КомпонентыToolStripMenuItem.Text = "Компоненты"; КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; // // ДвигателиToolStripMenuItem // ДвигателиToolStripMenuItem.Name = "ДвигателиToolStripMenuItem"; - ДвигателиToolStripMenuItem.Size = new Size(180, 22); + ДвигателиToolStripMenuItem.Size = new Size(174, 22); ДвигателиToolStripMenuItem.Text = "Двигатели"; ДвигателиToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click; // @@ -183,14 +184,14 @@ // клиентыToolStripMenuItem // клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(180, 22); + клиентыToolStripMenuItem.Size = new Size(174, 22); клиентыToolStripMenuItem.Text = "Клиенты"; клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; // // исполнителиToolStripMenuItem // исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(180, 22); + исполнителиToolStripMenuItem.Size = new Size(174, 22); исполнителиToolStripMenuItem.Text = "Исполнители"; исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; // @@ -201,6 +202,13 @@ почтаToolStripMenuItem.Text = "Почта"; почтаToolStripMenuItem.Click += почтаToolStripMenuItem_Click; // + // создатьБекапToolStripMenuItem + // + создатьБекапToolStripMenuItem.Name = "создатьБекапToolStripMenuItem"; + создатьБекапToolStripMenuItem.Size = new Size(97, 25); + создатьБекапToolStripMenuItem.Text = "Создать Бекап"; + создатьБекапToolStripMenuItem.Click += createBackUpToolStripMenuItem_Click; + // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); @@ -243,5 +251,6 @@ private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem почтаToolStripMenuItem; + private ToolStripMenuItem создатьБекапToolStripMenuItem; } } \ No newline at end of file diff --git a/MotorPlant/MotorPlantView/FormMain.cs b/MotorPlant/MotorPlantView/FormMain.cs index 3eb4663..3834ad0 100644 --- a/MotorPlant/MotorPlantView/FormMain.cs +++ b/MotorPlant/MotorPlantView/FormMain.cs @@ -2,6 +2,8 @@ using MotorPlantContracts.BindingModels; using MotorPlantContracts.BusinessLogicsContracts; using MotorPlantBusinessLogic; +using MotorPlantContracts.DI; +using System.Windows.Forms; namespace MotorPlantView.Forms { @@ -11,13 +13,16 @@ namespace MotorPlantView.Forms private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workProcess; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + private readonly IBackUpLogic _backUpLogic; + + 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) { @@ -25,52 +30,32 @@ namespace MotorPlantView.Forms } private void LoadData() { - _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["EngineId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - dataGridView.Columns["EngineName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки заказов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void КомпонентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); - if (service is FormComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ИзделияToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngines)); - - if (service is FormEngines form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void buttonCreateOrder_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + LoadData(); } private void buttonTakeOrderInWork_Click(object sender, EventArgs e) { @@ -154,61 +139,62 @@ namespace MotorPlantView.Forms using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; if (dialog.ShowDialog() == DialogResult.OK) { - _reportLogic.SaveEnginesToWordFile(new ReportBindingModel - { - FileName = dialog.FileName - }); - MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, - MessageBoxIcon.Information); + _reportLogic.SaveEnginesToWordFile(new ReportBindingModel { FileName = dialog.FileName }); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void компонентыПоДвигателямToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportEngineComponents)); - if (service is FormReportEngineComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void списокЗаказовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); - if (service is FormReportOrders form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void запускРаботToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic -)) as IImplementerLogic)!, _orderLogic); - MessageBox.Show("Процесс обработки запущен", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); + _workProcess.DoWork(DependencyManager.Instance.Resolve(), _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void исполнителиToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(ImplementersForm)); - if (service is ImplementersForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void почтаToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(FormViewMail)); - if (service is FormViewMail form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + private void createBackUpToolStripMenuItem_Click(object sender, EventArgs e) + { + try { - form.ShowDialog(); + 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); } } diff --git a/MotorPlant/MotorPlantView/FormViewMail.Designer.cs b/MotorPlant/MotorPlantView/FormViewMail.Designer.cs index 675c7cd..9bbb217 100644 --- a/MotorPlant/MotorPlantView/FormViewMail.Designer.cs +++ b/MotorPlant/MotorPlantView/FormViewMail.Designer.cs @@ -42,14 +42,14 @@ dataGridView.Size = new Size(776, 426); dataGridView.TabIndex = 0; // - // FormViewMail + // ViewMailForm // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); Controls.Add(dataGridView); - Name = "FormViewMail"; - Text = "Письма"; + Name = "ViewMailForm"; + Text = "ViewMailForm"; Load += ViewMailForm_Load; ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); ResumeLayout(false); diff --git a/MotorPlant/MotorPlantView/FormViewMail.cs b/MotorPlant/MotorPlantView/FormViewMail.cs index 2140a57..3361f4e 100644 --- a/MotorPlant/MotorPlantView/FormViewMail.cs +++ b/MotorPlant/MotorPlantView/FormViewMail.cs @@ -26,14 +26,7 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка списка писем"); } catch (Exception ex) diff --git a/MotorPlant/MotorPlantView/ImplementersForm.cs b/MotorPlant/MotorPlantView/ImplementersForm.cs index 649c03a..6708e58 100644 --- a/MotorPlant/MotorPlantView/ImplementersForm.cs +++ b/MotorPlant/MotorPlantView/ImplementersForm.cs @@ -31,21 +31,8 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView1.DataSource = list; - dataGridView1.Columns["Id"].Visible = false; - dataGridView1.Columns["ImplementerFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["Password"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["Qualification"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["WorkExperience"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); + dataGridView1.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка исполнителей"); } catch (Exception ex) { diff --git a/MotorPlant/MotorPlantView/Program.cs b/MotorPlant/MotorPlantView/Program.cs index 048fb02..e93665d 100644 --- a/MotorPlant/MotorPlantView/Program.cs +++ b/MotorPlant/MotorPlantView/Program.cs @@ -11,6 +11,7 @@ using MotorPlantBusinessLogic; using MotorPlantBusinessLogic.BusinessLogic; using MotorPlantBusinessLogic.MailWorker; using MotorPlantContracts.BindingModels; +using MotorPlantContracts.DI; namespace MotorPlantView.Forms { @@ -27,84 +28,66 @@ namespace MotorPlantView.Forms // 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, - MailPassword = - System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? - string.Empty, - SmtpClientHost = - System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? - string.Empty, - SmtpClientPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), - PopHost = - System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, - PopPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) + MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, + MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, + SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty, + SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), + PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, + PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) }); - // ñîçäàåì òàéìåð - var timer = new System.Threading.Timer(new - TimerCallback(MailCheck!), null, 0, 100000); + 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, "Mails Problem"); } - 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(); + 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(); - 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(); - 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(); + 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