From c6647600cc0a5e95c5af2f5de632ab9d11c296a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 29 Aug 2024 16:07:25 +0300 Subject: [PATCH] Continue with part-03 --- .../abp-studio-open-with-visual-studio.png | Bin 0 -> 23863 bytes docs/en/tutorials/modular-crm/part-03.md | 118 +++++++++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png diff --git a/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png b/docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio.png new file mode 100644 index 0000000000000000000000000000000000000000..b14fa9145e689ab5da96c50b6dec4a6d20b7b837 GIT binary patch literal 23863 zcmce;1yEewwl3NU0V22rx5k|W_W+HjA-F?uhu{t&3GN;|xVt+9cXxMp3)*k-?|shu z?>)88+4sJxx2mb4ReGkR>G`@*vQ28sP8q%jduu zW&_l55Qr2c2@z6sPC8h0(Ns`*1&_$MR{i^s%5i9fSFR;Sf**#K2h#7WPHFnj6 za`)Bt2}{w8sd;x6N>#OCCKIDc5do7@v``maPxi|x8vkE3K`6oX++ zpkw%Mlccw9JH?KPbyi>w*zKgko**gTCSj zmpse(t@ln415_t+0%Gy*l=m$EBqruhV8fzl)!ps2g=vVf2y?_l4YEz#I(&{G1qu4NP!=36Ra2SZ*`Y zH5wSwH@21X56*UGR;@PhT~bKEd_b>qWi5gY4#mw|HzDFUrg$7wI;T}pq00$%<^4bk z=xvIbDnYWkXmTd3**!))tH*MFIGm>ZZteK%>CWFLWKUjVKHgmA&=NB1Ac{N4O$Fpm z8rwAsH1}$`an)ll1qasaZ_K~t+p-pg9Z4VPn%1ewr)bdGo?Rs@TqS?W&^3Jv0{KcV zx1DowZzUOYQ7^l1noB?~@|PNxsf^Ejj*1Dv=?QChw` zTLTAuq&-!S+f2=mf5(}lo(Owt8+owqEtahNn`|#H3uK#AAL!`JX)ZTjff(I1q+FaW&a@(h+OcsJW>Em2}mbu;S)dcKEqPio^ zFH4qRd7;GuH=FD)HSqnZq&X{>r@WHopkR2?iK^8GB#9ft{Xk|Hq>NMZ$c@%erwI3Z`AnC&Sr-iWV$V!sx5mfT%uU#n}{VPyh`AQ zGR5evO=2zVKZCQ8R|%dZ76YFLohRFD=;-a-{B?BLpMkU$J%*jxl5v`if1ZrrPGbfy zdTiYcImWk{CpH*}77LPo`LowU#mo;*M}14I)$n<`Yq>G3(U9YpK)0Ja%dyeKEbo!@ zl*I8bz9TLQF6?UV?wux*P=*Q$aJu16qVSAi**c4QLs9P$hg;G z^SRows=DB)$Z97XFG;z-|3y+sV8C9jxtPiGivpp*HJ@>P%WZ=dQ`#? zmu<%0a93R=pM)UFFHG||nHI8bC7!Sy{noiEVN;<1s~?qFjwWcy(WdNcW$EiN-cOg1 zK*uQ}4Xl=9ve%o|yI1hcAdvp#8b+mcoF9d(KMltJiWj$>yeUW8+L&Ig3m&Lv=I6<^pz+gfsXt+|(EA zf(|!3*IHmG5jfpu>CJXH#ifzZbhVl7d*<=r&hvr!=?m3yzQzfPce74&=FasshP{IW zs;^96v!ebuzNdBHmR*hTdU+`k8Jh@$KmjmQX=#}ApW#DXz9w{ECLbkPJuc#|KmXl$ zD1eL{0}0e3*&fo%!@Rs#AQvHv@b_1pxU5DF$`btJXw-N;cs1n4C-1v8&K<38X3)BO zMR7}v^BbHWZ9flLB*j24t6!9qmmA&Hzt;n|C09y|CX2rH6*F_b;0JxkX*T9#pALP% z@?0suczj)!Gh`2@!+IS+70-)Fso868RYJREoQ-DQNZjBC$G|St5VQP9#?;$zd2#p7 z6;tP3dQ#>7@6gEK`@56|79DthurJegTDwRnj)=Q_cw2(&$FmyeeKK<>(Yagn#wytGI^ebe%IGp&;e^IWJ~pHH4&#+`Xh0cs6OJ6;)` z$e_>h{9|D^5uz7CD#%E;M`Pm-Gmy;Ot^AVG+n$kX&7YvAs2)jBb8ej&7Gc<%XJnQ=;-?~ z?1G0=_xBaKlVuJ5{ttoOw~HhWOSGo#<&P_VC1%2$o)rSV{+2B#8HPrQ>2s*+4EK8> z=82wjjR_3XFr)1Wm)NxF*yPHG{!(VaKromc+I`L8aaFwdc{=}njn~QCRrR#A=e>u} z>K1gGsQGarK1 zv%veHx<>y@K(b{*WufCUv};qyMJC0=^1CqJ#8$JQy7odY+RYZ8iUewX^GY@c z0R$4`pAX)?$u@4XSSpv4bvvR3fshJ}8@k~@aK3JQAbC|YfEb98IfFo7Yw%N*RTBi->W8)_yp3@B>iq&pyBvOfd%>k2owr!pHu)2 zV4$h5tE$%Kc-|!z325>^@4-(j($=6ZF2e42BLxjd34G5fD>GHy;?WA|L=Fk@pi(o8 zkZTphwVKR)k*}2BsA79E!vrdEkfCvO?Y(+Tz;H^D5Iq6YlYOX7H z>UUi7C3%yNL4U7%Pl<$>$9|-*Z!bz#peR2-Fob`dcY1r77rf+Z-uo$$p|0{WE_0}6 z%TA@KO<|O6WK59)EZN!ggYF?7vnoJpthqV8q02h3i$xOwu&0CgZ#m=+U3>cvwRgtg zNYg7qKIfH@wC{Ib{449{IHtW@j5>bBcNZlED%`vcxC8{KRl4VO1xuv{PPCsAw@h;9 z4#mmya5ym}_XzN@uw#^B=BNUp$jDHL6dfIrLn1!Dgs5l$#U)gVXc7eaH9jJU-!SA* zZS@#vY;nJSl*&wn4EwF(mn^{v3qM?<=rA zTWVu2XS4l!9w*hKTz7qn#0gedTx=z%KX(#Rs^I8&MV;zCm+?tMW4^bSo1R|!Ex+T6 z4C;x=pWDD<>v{Ra9ixTb^4?>2lRPM7;!~16&DQI?v-uIz!9k6G^ZYxi%FWQF z8cDs?_!i?>ByiJ~;zwYD?(iI|kbQiMUqQ>&R))-Br|j%(Y_$1ks}Wj&pkTcigeS^7 z?=((r6xbdnX>Lg`&HYmV)!5(L^R;o;;^yUrxruj#35tEOukzTwtsSzhPBu%9j0F6; zO29rjnCCDbU^TbG?Gr{@gF$$xb4$vL!FRMpu2ABbhe_at(-fFWniR#?N@ zbcu91t(&TTc=7LlM-{NJ%zA|x%xSqK|4Ee)?PRL$JK|%#Ys|qdCAfGtmA#nAq5-vI zt*&MLlNYVo{t>_61MmHg)_2ZFy>kYqco0aNP+wg`!;SwFV}4O_@$UA3KDA7ffU#qk zPgU@MARF5RV~*;DLu_np_S=T*bU8#*;Me9 z3*#h4l%6kTIGdnP&##U{ghvcGgG`LfY_(oU*b!!4WKJVnQ+c&NC%A zl%t`zSoaC=s_N?zhz{HMzPwuTnO?^54&~4={p0wCo|g6!ww&YZo8ViYAVE=pNCHCQ zjmVV|(SnMIK$qa2Ij3CU@C612>R&qe8ZKpIXTMk05toxIgPHmIx-u9Vrj^z=H$S^} z``iKGeO`$*+Uo+fzCPf+Gh&ohyDeHwd{I$R{!kfx{V2%T3|}V2Kf=wOn(ltv$fuHO zWlc3o3}t`ygb02X3|bnx+=4t@{2kq5IF=W1eQ<_`S>Dv$72_kVbMTHBsJD(TDuqkEw1%@v7gh*7~nW6mW zr#cMN1GHHOVyof9PFw>>t3Ek5L3)_Uz(JETMC|m%acq+kxVRV~P|usA(Q8g7(^A#+yxOxf?#O;X3m*BJX=$p`)1nd-~~P0TbMfJRtLt{`hVC zWVJmjE6an3k&%(#{m;pV+fQSk1C9jVYBNVX7Sw7BL)0-ZxvIq=iuT}w_3+w{nVG$N zMIj6N%g0L*Bm7u>3QiVbe6jrDWD@KFd-!{ax7{dHV%b!?yCxIZRw!_C2eE}Nsh(|Pr6;#+8B z!12(hF~!x7>}x#n8%Gj{gdqt1g&wHCqon?*Nb?yJI5aldSN!lFe^gfdnPR`I%N{ZH zW4D5kx-=_dPTql&>@e_`H(PgIeQvc<(LiWeK^4ju6Z3qQhflFxI$P=v^U~DlC+p)@ zli>-WvxU3SHqBE!t!=sQc?IGR1`5W;dXI>xtNyH0Q_7?w$i`f;7i7_q)4gA-ZHs#| z2)Va2H84E=nF@J(>`a$MMCa10z^)b=NIyVaU{|4fZHtmn+dH zNL*C0>&ODzsLjim4=H9WC6a>ijXRq#yaNVCB+2i^YU$(L%xXemtu2E$w4 zVVfTY_)FZMJZ2HV&x#pUXm6q|wz%;!Dx17zajH%}>5H#z7vSr@V+N~1`_+8v#>6wq=bxwv~hlOdU`q*2^hrL&AoR{Xf#brCCzNzM-0uuXrpMFOS6EiD3AGaO;2~*qV?aD0@dqWMhYIv0}h2S za#}wcYJN$*DvM4F4c6j_!-MN>s64@n33Jx@rLhOr3ft(XQi; zn0;Oc7zT1ma}W7oN))wh3XemeKM+CS;NTD^#lx%vFwm!aCywZuclT@W&q@?t2hh~j zp51Y8B`|af5WJ6nq$859-`+Ssd!P_#s<(gMiHB#iKt$qvhXk+2%c5MZWc;xBR3f8j_orHGHtOXV=g;zEU}C zIx~mgA%9@9;9tO4++F+v3i6r`puf4&R%l%CkXM;!BdTR;e(2S0|0 zC!t^*8oxB$9E)m>FCdVpLT-B0KpDDTkQ5xGA{wVK&ZV5(uRv&t!XB{Co6qh~*)ck` zWl|88*>B{1E5L!mS4Q-;C<`2G|LXg#k0QEx8v#spp=G5 zs}=5UZji|wGI^}_(9q{UruqZ0x3MN=x>sn&!M>ggW9imR;D4xM9c)lvd*aDWBuFw878$)O~)5qP#X&$ zsnugrA8 zz%hKg%>Q9kk^$RHz6utFcP(VetY4ON7cl12p5t}1K~sjE(2=j{Hr(ks&gOg34p1Pu zU{g!W7zdKm6kh7)`NIfqJg=ZK*i;;Q=gNA8OBOrw^6)#(^;~O7TCPOc9|dDf>x#6a zQ!`T&GkH1JwV)5sOJu2hx~Ak4EGWRm^MAIsp3u;^k7RUA7&K~%Jtx)q_(Ha8Sug)s zU@9S(+Jl}6lRXfhPd^q@E+kVef#1>hU}LS%Sc>Rt1acc3X=ewyUE$-=P&`lZI-^_q z(tx!`RtdXW;L{)`6ovKx2}AnxClIA{yWmESTwEl8sXQ9Zd7e?Z}HOr#Wv9TVHv&-!4ys)`J zE|KrRXExt`_?p&QF$c;NTMN#~&UQSbs4#U@;Fa=RC_8MQY$HqcT*}yT>t9AzKRr4L z`<0a!5FK5L^a?}@NB+(^rDJO1-eI{|uvqI@-IuO4VP-p^g7A5EAdX?Y5BgogV5_9dkD*WhW2Loqj;^nV}9RrK>NkH6{Ac z6m$1y>l)_qtF>xrI4|$3#P!Bl+#INCxX4uc7yFep6y?KZ^{H*EM1gR{_|^z}*3?HS zleKMh+%z3UK?T@1kV4+}KoSvY?+n7xX?Bkv-gaUH9vsK4quuCiqZ37jms{_~Yk57Y zmojc4Yo2vq+b-vaa@>-qyS={J=HYHT>|JRK2DjDqgyg)Ap_aL{#i!{67UoZ6IzFDx|eUo5`OE(X#N(fC^gJ3!R)_V#uc5EKy5R=2%6P!mWc z!NtwZ&*y3M;79H@AJwGSw3G$jt7OrgR+6~Xnhkik`;dGv=eov3Y=#kmOUic5Togpf9IM)j!ZI-!;{7! z&J%&)6FyX{SXd(K(dJi?u&kK{?Gxl?)=Ke;{b0>|>t{hdXZL|&# za(>ri)?fNJ2u%&HcUA__&;dCTp$rn5@eFX#o|6VTPft&BP6vO9zu@X%bU*zq7%X?> zlbND(3 zy(RQ-@L#dD@w`;g=2E8nJ`c~lp81ck5>{%Ha;!~$FbK3`R5|GUyJW#jb-c87jFhS6 z-b5z8(GL(S{2~4;+^!cUqN1IpY?R6Sh4I{NQ{jWm*vQg}z<7eiI^+`z3icz&#bcSY z^0Tu!evC&2(T81f)b-*_dAM_g`Oh$Pe$XIi4ZW>E!2*F&X8nJjeyLj!gxw6cJl>k? z>#w89EJwJ^GW>;^7)BDcci<*-^ZmpKwTVyd8wveC*a0hDkg5=XtI zaHijy!`{d{9ZO=PH1hA_{(!GjDLyaJY`OcT8=mtV6bvEP>k@%5x7?RYQ1ICAjLciN z6#ZhUa|v`G1*5Z06nOez8BFH8PFs4Nxld48pRxm&j+qk*5xUNDbR>Xbod*dGgRTN^_i?96Mot261_l-uBnwWWZTh2|usR1X31{`3b_ z%piFbcMpoxY%b^7#Id4r9oSDgQZR<*40;_bWem$reEQX-@m1DR%v3R^!E*C*T_#oI za0@k>(_y~A^~e?6DZ9Qg5BFTzdBzo`R^(I(rhzf_VW?NGp;<@TJ%zwv!eT5B1oC?B zihjzoZY0>h1NB%ZP|%|g()q2MEdPH*x3jhfmS-RXGXwZAMd^M_PK{gk?vKNt6tcv| z?q_}OwJUPgJ!P?4DDI_fNCy9doF4ta%+h8ovoAN6MBVJBp5|fFT+`et!Dv_ zGgo4{bYKvLx@Lv|0XhLULd&|Ybv6_NAuJKKD+;a(u`os)nCS8NwT-jV%DQpJhjWMb z=0;5kjsOP)!W2_Jp`f6stge2%8TKNcP}@&}wxsGmR+MDni9c9)GPf+bCGL6&cHaZM z^bG^@(3ap)1zFT?$=G0~8^m5PK(?frC#|UQpU9{U)diqYQIP@-iyy0%cfo_;8r9#(Nq_(|1wY8_Kkq_KM9>tdRg zHvEp1pw^e~zbV5?bXq)Nj}JA=o^GYo#Dla2F>KQk3FkfzfP<$LhBFsR(-u>tSKMq? z`yNo!SFUq4_su$=?lH6_vxQC~c=TD)Pi=*N(3G8U#LN+5APcSL@SDiXOv_vMQ(Ydp z>++`l{r$hN(#M`P&KVhnT^dXr|BK$k9G^DZV#f*|7^XO7C2h5dujc7%%(w>S|muIvZL}BPkfICJLDVgzJ^7 z#wWaZ8AT80!@$b>RUheVw~OD2Jd!tEb$@z{rVk69NfE*GhSfJy@^ENNo-Ex+6934G9YLU+ejf~L436j*o2J*sj16oga zj$>fO$7n-~$nJoD;7m+^GibzQYF4OGX}wXhh-1iIa&leI=BgHsQgujDX?;$w1Wssn zmYaN3h}a*_qp1mx$ne3&#z2qAn=00Kio*fT4IhjW)ow zcQ23LqL|qxe_xR0eUI=G1WE>?8bNCiNZJx4Pj09}@WgljR)FzuMBBfv&W-p}Sj`Fx zfNf`&7E`Ww;XRu7`}Rgr^_fcmp;J?AtzwR^X$xABh+n!h7#eBa5=6tucz0jXVs7U6 z$ev*1ivWD4PyZ`O#M`*)nM6njo-7o4xFKmYevs`LeP63T?^p0$MBt%OeDFH9g`jdx z%Sas92O2h@Kp2jiNl0ipn!oI>+ShtB+|dQYx(Pb?P7S1xl#a$ILl*=>f%uu44lg7_ zh!+M2`fQIo^lva+LS<-rJwj2oXDFxtUT*3-2sASJ1tBakaelVK*z&K#jc^Uf`v`aq zC2_aUXtf;W{7-2VOB^P;kFxa_r3n(|zc186F=xiKJQ-SPs?Hle7+{R-2lo}dpqRLtcIhmf>Z69h zI&@Iuito*|wUW|gYwHJqC6kaaGjh9KF{BQoA|WX%DILNVR=ZBs*{1tc=X)F-TR(;@ zAi8=!L*Wx)8n!D-EelUo5{)KF)!eWB5)gLC6*{Y!ifu=<50mI4>ywm?RAtn7H$N3@ zZoqr@;1V@~FqO)}%{bh#{!phZ#-o{1v0RQ99i1Rc!H}o88lU*ZzH1h-vCM)_g<-w` z0ff8j>t*N7<|dQE=dw3J3pTT~1hP7WSK0_4zGp071r`+vF?5FB|BYUsy4E!*J_Qjh z9SXD&@^?;DCFBv%F1*nP?+X=qbxNk@(su{K^LN<@Wyf4fOVxKBdxe8oDQAAqa|YNJ&O9l7U?+)BFk!5hq>mS2fWFN$R=27#3`zT z97GL> z&=X<2fUp6VGc`+(o9^52md2yY!iOq0HugN4GS|19lbkep`ABI^+OmYU<}79_5!?XY zy>kYMQNBR^iq$*_K;eHaKl?lSMepqsZ14j+*3RBE0qA_7@*Lk1RJh7^c>ps1m-4lL zs1G5f_F=Ve2exH7WmmTQW%zv(%Al_ihLs*nu%ye}!eW~v$l`gYQqHk*53u(O8X5P0 znW8`~tE{YyBCRmH>5$SjM_<^jzFS}%7vz@(1!TDxxnADjXzy;#vdoJYF94B=yn4}( zYCd$qQAeAb4`bLAKsTkMXDT0Io$T^d27zt}&{mKLgP!%Q>V)YJrOodS?i6oZ_g zMFa%&R_>06kqAzWjlG|-+sD`73#sDd35$D-8nUR5Z7eKOpP%unP;-M@+P&dcf4EbI zIbCfbyOUz9Cil&G3iKrs_=F)u6%JP2>jhYnvUu z>Ri5Gza12m_qw}Zgv~pd)2PYHw#*19QdntzVKFz+dfvLj0*;-_EG#Ufqob4Q?ie^f zkLm}>%TUJD53yQ!X(V7o311l9%_kuCz6z)l1`knKU*oN_V+Z)>)^P}KD(*d~uc10~V`!Mds)KYbr*?x3 zU{Y#(UZzGP<_S0)p42FFcZ>E=QLyXaqPc0;5H^gfZLwmck!oA@pGWG zsM{NOO!v1ldl)gsojQ%0bX3sqf-cUg`&V{lif;RYh$Qm}+ys)#0uncu`AY=n*(Ubd zoAk-syK~ ze*8#y5P%a{ARt}mb)yUYOBBGK>j%%@qZ7|#*odlY+^_VdEey>n7#^kdqt*}7<5yf2 z-I}D1O!Vq6eJtwN5QH7oRyO}>i_u@UTy)bIH%e#POy-9?v;Jr;%>|a9DAnh9TGf2UW!U6UIw~+v(w*w3=|7`v z?b_;O&~5JK1~19{GB;>cF4dvxP~)#_=_mz%|1%lbMN5{>1B(+MdPr)65u8sUuiJ4I zC~#h-Y9%#wF!7fJ^mZ;3r)h(rQ|gPW3la2<`lM<0Z(PTr31Rvi8bS zs{(JGeWPVYKGHL1>L#pkgLUjr^+7i3_b`3#1?RjeDHFl&0|mN*3?%c;jutnNg$$*l!!#f3q}s`sfQ z@5tY|&f0#4YxdgCKQtH*9ai0Z^|qR*TN}@s#_|(XAqt=1wmCqLx9wMd!>O;jWeMA5 zZD!VJL=zw8dBW}7QI7J)Ur6*V!NwDIZ&+kG|9rZ?%aY9LcuG`(Ra^X%=}#yJwARkL z6vquVq% z-)&$$TdJrsaENA)HCQZUcQ(YRIhMxt2PzqxM%j}T$#%<63$vSlTND;k8Gpu^Ur;U_ znA))kVb4sPU1tjQ?%%W4Ql1v9by#gx@#=r1(94SlKWok9lsDq@@$vD}Y`Wb_e1nCB zz@OPuDDG!R(!EghlUHtfT(zOPjPm{dDBur7I;0QW`=hH1-N5@mgeop2o|jeVi(P82 zLA}@aYLnOT8(MCOIZWEh?(TRy!G?)GxiC|6mtW(DEIr$0bL6w=W<7y{&OW`>ox;ah zRAQ~mD?q!MP^pOq(~u9-ruulTyaeQ^eq>_H%Ov+58!~8?v`!bhx9~q|&%0-xwjINk zPPD`_x<;rFu&>Ld5G%u68Xr>Cx@9R02{#5#P3@xgBy(yp{R(XLxzmE+ba4TlUm-@Ji_D!Sh%Yn3Q*5 zBfcR$uMBfo4Q>*S4phv_s-*$y& zRXheerRFrONA?Sb)W0pa_}-l7KZASXNFJu7k-uH)x;{q>IMvBx&2KNS3O#R#cufk! z^0{YJW)1&G4-p*qyPH7xe4f5b{5M-OqeVx_xPy0m7hXE>%u59&B9r)UV%_FpIo)Qs z=;%$2Y+yF4>lVR3*Klv2?ruy}dYj0}$nKhVV-Js0ZAGVjd#>J{qr!eMch=iG{QcgE zV2|_dWFmsqrTVXYor?qQO1&3U-YohdW|SP%v2k2e#4~FF9iK9DU@z-& zoQ-4bQ%3BoCe#u+;l9GDDdnqw& z4to*v$o@jXGUmY6#<5OSOHKEtgG?spmtR5x4^YG>E-oVJ!gimE==(uP7bz&KLytBu zpGNSlvJ^f+_nv+-7J@E>p{ngX9T)&+kb`|COaHUH*x0Fjx(H%%#B*X?uEOEpAF8UW zrzZTXX7DA5c7FY0@h!@G+>z@mS9*RhHph;Tq?)8?jFQ^qHe3P7 z^}|W)2T6($I=c2UaX2xex6*al*)mHRU$=cD6X+iK@R54fv*{=)`P4zKX_=Wc`NV4^ zGhcDSBk8^&B4pQP!873xvMy z{Lz7pl8d&nvNO8l>xzk4&6CW5G;p|Q#T7T5B`-z^+{w1@#NannGUX_Z^F zIh)Va)S+t$d9)^==eJk0klUp88=<4%kdPeNRL`w}_&U4oJ~sxId{XBR9Ixfmkr`@$ zJW`f9L?#V&_=o@NH4X?t;j1@n5x&THGZ#uP$-kFJmN)tV1(mULAE;j2MQSl-RS;@- zn`t<>#P8EtV}ikBSc$`Z(g_0W-@Uugi^I@S zNcr?7@xo2{unKMCDB{DH$NOXHID}BV?=3#h+L7Ae-hT?W8@1fzAkn_NOaB@E!#?K& zqIBHJkB^+=cwP=Z3{1 z{Lgx^62z~Az&>;<%YWD2^KUKv|Cyou{pxm^XyQ7~rpQyPH*4QSQg&+I+YLwgc;pVv zG*F97OppGa8Tt9m7@rg*LFT-|t%!z0sBvLX)`?YblcQmam2EVRl`RGjg8RPWJxV^^ z+DgikRa)_DM=U-j#CxF&4%8$cc@6r^Mjwpaq+1sWcGRM<)vB5;azFOnnTJF@Oe6B_ zd;;u;e8VcLivIR3dR^hGa}HBMdOn~q{$b<{dIx=R2bPb9uytZKNVa8d>Q&0pHu%#AN`uDNq070iwdB^+|&)>doNQW(OckKAKe&7bIBdBKa*!f?MF zEkjj#u&9M;_gYd>d8<78A)~SBllu6q0qMi;&-qVRMN;YCqD|oXnQ~tCn>>QusxLwU z#@+k+3XYU}?9Nl~FRti`HtcCyK4 zvFvTYE87_c6qdlxU2taxx+gml5++QN*XSqyJsrl$UK_D1Xz5Ho{PF7bVh4MccHUUS zgI@1JWXJ$mK+Iyblq~;?FU4n^u7W9#I@J$jnEB#QV=e8=>$S~roI(x zR$-z1Qag}yc>#cDR$n85L6wA`KLE?$$Rh*(!~f_4U-g!$iLRpePSk;?4daKNK$F;^ zV5^*Jpzfo3T2X{m&Sy2$mAbDh&(vy(nrPV)>N`Y)G{1yyRkX9n5WDa-y&nF&bHz2Peq^@8Gs^!^9m&LedXEg z>P_+cmokjDC#&cYJ}|&f9pf@Yo08`q_B1{DJ;}6(^Qs`$iLFEQ} z2RhaC*>qhNvP6u08f zmB@0;e1C2A@>NXiRn?mh{Y#7N1}a~`=ykRA$b}D^^!>usFQljEc$^49tv&47RaHt$ z`d_z2mJY#8Dk=cCK$jxTWl0@~x~5sV`TBRG{O{U7{)I99e>|N73LJEQKwHd0G#j*Uw_=^v>r##61S3M__=B>1uXPxrL6|8tZSd|Oxe79(gSAb za(>e4FA+t6Kn#w>L3Sg$O&_-`c_4~dnBShB2Lhfa(&cXx(lW?6r*ibdgpba1fzdJhzhsKxguZ1R~pFuFNShbIY>9MewOZ-n-=rD*+B z*gD>TDk?heUx}Lbprb=Maw#y05SXz*2&ipvRd9w&dW4!$T zwAyxlD^NHYurk>*C`U|f=r$a>OFDm!7tt{27>RnAK$xixj}aQ*MEoUOOL8q|2Rp_{ z`Myp4sjO*nH&pA1UD*jWvn0R-eeS>?pPQpQe%E?VcI=2AS3rL(*ZPtYP4TDfR<9e@ zi928o|68i~U((&bvzY%WG5zn}&68JM4wFVY@0f@aHY3U21uUSB!DcXV& z4f5U}Bd9S(GWlb7zyrpM4vmL(p5du4<{KW(+Joc#dE&O}3#WmYwbi~q^=;nW>#2as z7ia?iPs4rpUkvx|svh799ES6S%Y>PKVWZpl6QL?4inVqmja(X%EJ3pWHNcN<2$(eQ z4jS-iYK(Hk6>gw0Of7tAoi^~5WUUf+yO3Xge?QGTZmzP2+QiZdt4{JWuL_Su(C}bt z=mJ1)D|oj#pYU@cD zxKNI$8Ngi(Sd@eOb9cnR=n;S&@0p~LX6ZL@fcTtP)}O`e@zyrH5bv1%;o`O0;v^!G zTUj|D=Vov8qR17Cp@|yEl9^R}M~P@^Fz+c|fq-po9Lx)s6#`TPUpCEWn^`3C=MXMxXo$iSw;f7?g*FA#H8&5~t+nBSG+ zm@HUbzdJMrXyf;N_6^Y&Pk`{*FR%Zbj=jG>DPw_X4G;_olc!fVEr`_mi6YZT1aOoth(WSri_y7#1o)z=;d)oedLa-i`kKq6 zX8$qFNUg=DhM3)fm#+y3Ffs5y0s=(P;aSLGsXLJaLlxj3+o}LTp-SHiZc3(i1Cgo# zVJqNwl7Wh}>5mhO1;<626OMN=#HJ11B7iqWgw1ihp*VUiLjf*7(ZMmeHPGi~Q3OK%i7Vi5-yJW48Q4S;@PVgL)c@r2o*?8zgTsC=~#(1M5sdwwQM(tR^(nNvpq@G9~XI zwooLwG=}N(ZN7tY4A1-v{i^aN5+YH4b5ydlvPW`3mUTG6sJ<)_sD}iwKb<%S4%(EE z`9nM48CMf7VSd1pU!GOMBj_SBC zG;I`^%Nyr^dfvs?rwHFvxc&?@{?D3@6Zf9~P3ERHL(#vMCgTH+704 z0|1V^P^yh%Fl@yPVBf5R+^ucjJ#*~v2sj;pEdPz_^`~!l;%b^#F=PM(7LW%>sQiWa zIT>PdA0WZsS>vH~7(T zEuRE|TsVg1=eiL8kBnO6wy!;$sVosA+eH8!0NBI$u1zQnKiTZ$VuN|ar!VuZkx)|V zKB>Ml;^)D_|C5tUjbJzdkq2GvPsyA2hf^qiymf_|knA2}?ti3kh|x}B8xfypAOq1Z z4M2UZk4Q~3Ssl}rcfS*!az&xx5<$0117ZMc3Qr7Iu@rX&WO3}eaPi$w;grK485t$*s-iIf z0;$R1^by01u=gJFbS?qy407W1xV>aC3u)7q#QoJcFREEw+$jExJo>{YT>(7aMcof9 zVNX5We~0h?xjp;;^y)`1Hz%C&srapD_idklLQBi|-yI!reCH=86u`Gan8u*}J!-{- z%kyy`LS@KKCn^lF_?au(>>q)E{>sifDHlw@{yi34GzFK^btsmmX)jJT_-!MhUn|Pq^RM5i zQTVF?fbRS8bJEKfL`})ny*mZM9vU8bKW951^!bUdXu;rollLkGG%E)LzbcUNB(h|8BOWEg?G)?UuEKgmn)%N*E>_LPT0^bv)y`ye5KL;fsYI0*h=T8 z2nv(KUXSNG4|^(3M+-ND)}HN7jN$TVe668wBNNb&*kZo5Ilb?;(n_Wx^qsdx-p8hW zjy0K+77Hx#^ojQ-hrT>)QbeR44*AIl>0|Fm-5K~25e zHlToXX<|W2484RO7C@R{KoAfS5UGM9y($oTQzW32fB~cmB2`)-p@fcz^d1+)1H{8;gyO+_S8>D?-%~u70RDw z%`8(~4GF?SJdZ473Q%W}xvN=wjoZo(y1MRFuXrRnA`k6D({H4(URX_hV*eyc{hh5K zv1Ri32;OQK1)sgx4M% z=?C!a!w?9p&T~q(4OD%dZPQ>6&5!K z8ZrU_5xkpw6*8X0mfXJe_zGSOn^O+vS% z2Y`27q&ZR*e4|LLyw5&a7D9-k>w@3C{R}Cf)SW;}e~|ER74|n^ z{0m?HEyZg64$Z%vY=cpb1-jenG}VosSEZ0xL9w95Q@AoT8eLw_P8W*xX@9In9gxe^ zesCZ^$^SVnK3;&G4me!tvNz^u;kFh=_|#kGnn>yo%5x9qy{eg*>JN*JtBn&(nuVVx zHnq36&&+_i#pqLj;Q#~z;l2=r-I}()A85i#LZQ4j7L?AM-huj=OH8l+YHu$Co=odj zFpuf@Br7{I$`d^mZ1%|5Smjp(wW#Q{O;0?3ERlgPAiXB*bVzw;=Ud>FZbi$}vzu_6 zZ?|+g%__Qus)Rn{K7zzLvTj(k;39tb7T5;z|Q` z!E`y7+YKLwvscb$g`=Z){MM%nT{fqq*+Ih}Z7hBEX5%(mP6tLE%y8bFBdkuj1in}| zYvSA7Xw5kaRei6Y;tI8v2bJ8hdl!#FwZS?3d^E@&%u-iF-@H+B#Bc(mu6)ZcW^Zh` z*A)ac3n?i0d)sxGG}&S(8n{CZ4MTfyxVZc-p-vC1;MuHD6_bfspvnS){yy^n{}xS? zk`D&ECBIF==cbQ%2kc&n(Spt1p$h=*yYk8?;@GNae?rI9m9!M z_C+7Ti38ilLpD57J0ICn z?e=%EI^TYrgFA0zCQ>htK?8R?&}h9=hk-MHf>vFs-bHQw?#k;(vY~nUnj4E`?+tTD z%$7-^q5hEXoq5EZTG63kZR;ihpC^ug_rkpXcKuR?u~N1Ac=MVaUt9r~IS&hRXX@B-bhteKt#`sDQmZDD)2X=BU$JQ=YT%8I5c`v+QyO7Y!H~Fb2Hm8Z zu(s5y&?1aOOKED2npNW_3Pb7VR-kBE~UNc!9H1X zwE1|?VLc2^K0t<(Cmv$70^0}6dYUYJy`ED*Ms;3XPnS>mQ7~KWbVMsiIC5Un>ozO> zHPrHTt6q|<^P@Zx=UyCxy=4Z2zs@;_m@S118tsZDD}fs_16%Y=U3Y$HvVxPiFRu*<(@KAe!Yx*^X+RlffM?*^ z1mrg7s)DhYOIMHjn4zXhN7nD(`pT|Kk_Gb}c5d3yLpBCXy99BjJ~59Scjl&7;Z>?q zvFx@siX;!NNmoPKEr*5mjO^?{P5j4U@*Bo<`M28l4)mD%*-0X_o?l7(a~@90R#OM) z@lZxdVCUs$$I$jxFV16+gYim2aV%~3YA1`T1KbRkSv=O(g5MiP z@WUXYKl%;xwf(UNao3m5aW+WQ8a_@(p-?qznT!v>&eWYPF9SD3wl6>4pGp{4UGlXp zEuK~6!Vc1uK~yhR2mIws8vBNMGj0k^F!4Zp4_B^?4ffgc+<5rNkHpkfVWnKa$n+|U zc*?6CQ9x$#PGACQTAVx=&w&SE^l9##Qbo2 zvo$hP`MS6OU&!OA

>$fA>ytfc&p{#S+xi`Q020W?o~|Z?<1JocMizNce|+GPjN- zvHY-UbJp;4!uK&^O4Q@<(M6s^$s)LoQlQhu$5%t4W+#au5#c$?x;gUv1!iq|q_9%4 zK;b077WWKkIZI&B4eTI3@b;`NzRz!nv@d|2Qhl(sl(gwvYi=I^O}e&QJ@-xI?l2F4 z4<(HrqX%sF29qxdGRC4c4}VPdwT@!SOw$J^+G@MSam6Dui90My(AcLlyW32)=B-Tj zVOanh()?BN+2tumgQn=QRislgiWjX%GAVW~1Mi9!kAAH>{aoST6#_BmcQq@v1K9X# zrNLH)1b*jECP38RooKcWp9E_bGwWmRRb9FAb5S>NLssK`> zYM4kIi*9MW#I-@sOZfdsyu6rh-BCpTmddgR*ynJj<>H?6VNgPm*A?GzAcSV9b)>SU zm9lzQ~Ll<7%gicG8fc z0zqYgxBAt$V$!0LLqH{u&u|atb&6T~_)rTdfJ$^uJ`#ynrdRDfJw2_h1!ibKTMVge z!@?T(w#H^d0jvUAK-%Hru0me5>wXC!C5V`h6zzdnapz334`=ziPHTZUUyFFn4HX*i1`K5XqlSlA z@8=XNYYpaSPE)?u7mJJ7mH4SDHGAaQd=5o6Fc;A{m+oRNf+CwyaXlFQtN?_@KcN%| z^befkq)7fZ1catr!M0j~t)6dTVfn?5@D$PE!Un|Uk+YTFo4)T)u5HS^#BsY>BMNNb zp*;4YkRXnJ!{yDDPrmiaEPvVRx3Ovg@wM5ZP0`>~xy2m+2 zmIS(Pipa5!1&lT%454md zx0ufWR6o9p-lte~T|KciRcXnsi1M5cr==!4=lG55eObC`{c(r7yhSesI}CaPcp!s& zcjx@AWC|i74r$%DP7Np*3IycJrz$HnL@F&-4_TsByY)p6vP?PK@@N4f=IA<(m1duf zxVm{s>ULJ4v;$yuwSn*1o)6yvW-Q7Cij}in3>Zif?hBhk_rKv+~0{fX(S>M7D64h9G>*rF{NLwV1jX~3!zk2^M?BNZX%W&zpVtO(D zywxis3Qs001ynX)2NRba=!+F9XcQo*xaEiLW*D1cHNYKXQ-t{TSG62Jib@4o5`RHi zI=w(a90s~Ak^Anz2&54S74UH?Nv!`&i^ zsZWxBmq_C8Na#2hy(5WC#gKjGb#mFD5_kU3+2lV;J^yersu4~BiXn$YP23x`Iyi^P z09<-x$?K>zjcM|I(Op6}6SK@d^@8I|weq1Qa&fV>Y<+-dc>Nz{YE2wi5VyWo@fFADf!E!a%BSbhCgj^2jKd+y^VyJ?{l*lq?psAD4UH6 zUm>g_R4~)}+$>0a^Ahh|75_*8lxGfx=)U?>w6nDqKSM+@gwX*(zVpFhtfbvSLUxuK zsQAlry5je~)zC5ViAjJ!b6Mn&X&lqBGJ}G&T;4%cln8<+N^OQkr>({NUoEv;*4f{DwfQ4-(x1ah7lH?utNBkdFUR z1c$qnWDEit)qes*|BolPPvJlyb#LW6E;&w8K1?g>dw}AU`v5qT@|799J3k%HNv6@Z0SX|2P)qJ-&Tar}kWZ(dP$*KH|Be-eRuqW@dTQE|B6y_|~P z?RI}(aH1E{s9I}suuxsDt>D`AFa{@;_oU6;XqpZIAfEch*er|PX7Q$bVm6Q@7F1pW zZnFX^opTR$YcfOSyd~0hcgIT)-FYsAHB{5L@Vb3LHfV)0c}4Y3aiU->E5|PnInx%9 zBM?_X%&b)*wjy@TPR2D;I{4lg_eZ865D~a6oTG5gy4u@U0BvV~pc{lhP0Rfqi#SQ1GwNUHdS0L6Xq+;9b@Z6$tCh{JT2*624F3Uo1-6C_@7;qVW^qd zW&0Hw2zLDw_J4%K6CQi~C8?Ua&H-e7;@$r{2^#(g2qj!!X(;%DUA?ZGl{~BC^#WN$ zOO?G6746w6qGbArLfO1GYAW0UpRA+HqQ#(Lzt;iz#B&Szw{?i@h^CT6@vDbB5~rCG zP`&N_(H*fV#6qT9tDpvM+S8O(rWZ{QDBwQ40$k>d5=XoVnpBm*z)c!HK|vG9&FYe~ zUutL&w*2MjlC$jLQFD$8<9zZ`0Atk%&`J_!-}75HQflk$WVg1;qCait$4R9X+FStK zVSK`E;JO`z{$;%|;CGh<0#XgQkL3@^Y`nE#B-063Z8#yx@A*5s70EisLX+9e=KxVZ z2y*t!X{o$N0vzjRXKFyM(f=%W{L2Xbetb&!mJuvJ-oOqRB?i(^y$35&u?YDu40{M# literal 0 HcmV?d00001 diff --git a/docs/en/tutorials/modular-crm/part-03.md b/docs/en/tutorials/modular-crm/part-03.md index 7dfa4427f5..e76b9a32d4 100644 --- a/docs/en/tutorials/modular-crm/part-03.md +++ b/docs/en/tutorials/modular-crm/part-03.md @@ -14,4 +14,120 @@ } ```` -In this part, you will learn how to create entities, services and a basic user interface for the products module. \ No newline at end of file +In this part, you will learn how to create entities, services and a basic user interface for the products module. + +> **This module's functionality will be minimal to focus on modularity.** You can follow the [Book Store tutorial](../book-store/index.md) to learn building more real-world applications with ABP. + +If it is still running, please stop the web application before continuing with the tutorial. + +## Creating a Product Entity + +Open the `ModularCrm.Products` module in your favorite IDE. You can right-click the `ModularCrm.Products` module and select the *Open With* -> *Visual Studio* command to open the `ModularCrm.Products` module's .NET solution with Visual Studio. If you can not find your IDE in the *Open with* list, open with the *Explorer*, then open the `.sln` file with your IDE: + +![abp-studio-open-with-visual-studio](images/abp-studio-open-with-visual-studio.png) + +The `ModularCrm.Products` .NET solution should look like the following figure: + +![product-module-visual-studio](images/product-module-visual-studio.png) + +Add a new `Product` class under the `ModularCrm.Products.Domain` project (Right-click the `ModularCrm.Products.Domain` project, select *Add* -> *Class*): + +````csharp +using System; +using Volo.Abp.Domain.Entities; + +namespace ModularCrm.Products; + +public class Product : AggregateRoot +{ + public string Name { get; set; } + public int StockCount { get; set; } +} +```` + +## Mapping Entity to Database + +The next step is to configure Entity Framework Core `DbContext` class for the new entity. + +### Add a DbSet Property + +Open the `ProductsDbContext` in the `ModularCrm.Products.EntityFrameworkCore` project and add a new `DbSet` property for the `Product` entity. The final `Product.cs` file content should be the following: + +````csharp +using Microsoft.EntityFrameworkCore; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; + +namespace ModularCrm.Products.EntityFrameworkCore; + +[ConnectionStringName(ProductsDbProperties.ConnectionStringName)] +public class ProductsDbContext : AbpDbContext, IProductsDbContext +{ + public DbSet Products { get; set; } //NEW: DBSET FOR THE PRODUCT ENTITY + + public ProductsDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + builder.ConfigureProducts(); + } +} +```` + +### Configure the Table Mapping + +The DDD module template has designed flexible so that your module can have a separate physical database, or store its tables inside another database, like the main database of your application. To make that possible, it configures the database mapping in an extension method (`ConfigureProducts`) that is called inside the `OnModelCreating` method above. Find that extension method (in the `ProductsDbContextModelCreatingExtensions` class) and change its content as the following code block: + +````csharp +using Microsoft.EntityFrameworkCore; +using Volo.Abp; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace ModularCrm.Products.EntityFrameworkCore; + +public static class ProductsDbContextModelCreatingExtensions +{ + public static void ConfigureProducts( + this ModelBuilder builder) + { + Check.NotNull(builder, nameof(builder)); + + builder.Entity(b => + { + //Configure table & schema name + b.ToTable(ProductsDbProperties.DbTablePrefix + "Products", + ProductsDbProperties.DbSchema); + + //Always call this method to setup base entity properties + b.ConfigureByConvention(); + + //Properties of the entity + b.Property(q => q.Name).IsRequired().HasMaxLength(100); + }); + } +} +```` + +As first, we are setting the database table name with the `ToTable` method. `ProductsDbProperties.DbTablePrefix` defines a constant that is added as a prefix to all database table names of this module. If you see the `ProductsDbProperties` class, `DbTablePrefix` value is `Products`. In that case, the table name for the `Product` entity will be `ProductsProducts`. We think that is unnecessary for such a simple module and we can remove that prefix. So, you can change the `ProductsDbProperties` class with the following content to set an empty string to the `DbTablePrefix` property: + +````csharp +namespace ModularCrm.Products; + +public static class ProductsDbProperties +{ + public static string DbTablePrefix { get; set; } = ""; + public static string? DbSchema { get; set; } = null; + public const string ConnectionStringName = "Products"; +} +```` + +> When you use Entity Framework Core, it is typical to add a new database migration and update the database after changing your database configuration. However, by design, we are leaving the database migrations to the main application, so it can be flexible to select the DBMS (Database Management System) to use and share physical databases among different modules. + +## Creating the Application Service + +TODO \ No newline at end of file