Lind.DDD.Plugins~插件模式的集成

回到目录

对于Lind.DDD这个敏捷框架来说,插件也是其中的一个亮点,所有被认为是插件(Plugins)的模块都会继承自IPlugins这个标示接口,它在程序启动时会找到所有插件,并通过autofac注册到运行时中,然后在使用时通过PluginManager对象进行获取,即所有模块只注册一次,在使用时只是从容器中取出实例的过程,这也保证的程序的性能!

Lind.DDD.Plugins设计图

一个接口,多个实现,根据具体业务,生产不同的实例,生产的过程前制到程序启动时,后期的使用直接从容器中获取,由于是key/value结构,所有获取的时间复杂度为O(1)

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyEAAAIbCAIAAABzGgbbAAAgAElEQVR4nO3d+VNUd6L38edPOf9KfswvUy5Td37Ik5p6pubOvaYcCCLQ4phlMsmd3JjFRAUJELrdd4mAoqKyrw10s8kum9DQrWiMG2V9nx8ONE130zZf+pzvWd6v+lQGmqbpnDng2wOa/yMAAACQaf9H9RMAAABwIBoLAAAg82gsAACAzKOxAAAAMo/GAgAAyDwaCwAAIPNoLAAAgMyjsQAAADKPxgIAAMg8GgsAACDzaCwAAIDMo7EAAAAyj8YCAADIPBoLAAAg82gsAACAzKOxAAAAMo/GAgAAyDwaCwAAIPNoLAAAgMyjsQAAADKPxgIAAMg8GgsAACDzaCwAAIDMo7EAAAAyj8YCAADIPBoLAAAg82gsAACAzKOxAAAAMo/GAgAAyDwaCwAAIPNoLAAAgMyjsQAAADKPxgIAAMg8GgsAACDzaCzYQGj5ZdNA6OTdcY/Xz+y+T073nm+Y7B6PPH+5ovrMAvBuy8vLc3NzQ0NDAQQCgUCgr69vampqeXn57du3qQ8djQWru9j08D+PtuZWdH9yob/47rS3afZU8xyz6cobZo7eflh4pi+7tOu/jrV2j0dUn18ANvXixYuenh6/3x8IBEZGRmZmZkKuNzc3NzExEQwG/X5/R0fH48ePUxxAGgvWNbnwW25Z5z/O9p1pX6gORmr7HzPHrLI3XNY4m13a9V3lwJuVd/xeEID5ZmdnOzs7R0dHHz9+/OrVqzfY6OnTp5OTk93d3cPDw5td0KKxYFFvVt7+9ceWn2onr/WEb/Y9Zs7bjWDkfGfos0uD31UOqD7dAGywsLDQ29s7Nzf34sUL1TFjXa9evVpcXOzv7x8eHk56GGksWNTR6gdfXB6q7CWwHL7znaHs0i6+aQhYx+vXrzs6OmZmZl6/fq06Y2wgFAp1d3cn/aYhjQUr6p96srek43xnSHkBMKN3IxgpqZ/572OtfMcQsIihoaGhoaHff/9ddb3Yw6tXryYnJzs7OxO/Y0hjwYpKa0c+v/ygJhi50ffYRtM0LenLm90ngx/O1qvsCXMpC7CIt2/fNjc3h8Nh1eliJ8vLy0kvZdFYsKK/l7SXN8zeCEbsNU3Tkr4ce2Oid94h8W6bPb5NVxOIHDwXvNIypfq8AyCePXvW1dX1/PnzjAXIePluTdM07eC9jD2k1Z7Iq1evgsHgzMxM3MGksWA5b1befnC44ZJ/sSYYsdc0TUv6cuwtqe+z2aO9802pH8r6++HmxBfnA6pPPQBibm4uEAhk8g8Sjpfvjq2atdLRNG13+fi73/3eweT3u3dQKpbink3GjI2NDQzE//EdGguWE1p++ZcjzZW9YeW/8G91afZT9NJU+o+QziPbOrMqGmc9Xr/qUw+AGB4eHh8ff51BY+W7D95df1nbXT629srBtRdTuHtw/T0y/GwyaXZ2NhCI/40ijQXL0RvresA2jRWNm6QlFHdjilfTfLTUlB8Nufma5mgswAqGh4cnJiYyWR8xVZOsl8ai17UO3tXvsXv36lWusQ1vPXgwevlrTH+sg3cT7r/pA8a8lcaCi+mN9WsgXB2M2GWapkX/mfQW/RM+9k2x90x8x6QvpPk07DgaC7AIoxsrLnDGynev1s9Y+W7t4N1ohemvvk7SZatvWW+sDfff8IC7y8fi353GgrvZsbGqk6XSZsWTZgmlePfNKD8I0qOxAIsw+TpWTHWNle/eXV4efX3tLevvc/dg9ItdbGNtvH/MnTRNj7YNTUVjwd1s2ljVya5jxb01dRiliKcUl8FSfEQbjcYCLMLQxkr8eay7a5er1q9jbdJY0bfEX8faeP/161ivNzxMsmeTSTQW7CHaWFXBiL2maVrSlze7T4q7pf8I6TyU9eelsQBrMLaxXm+40BT/E1d3Xyc2U/Qdoj+PtXt3qsaKfUBN/14hjQVErTZWb7gqYLNpmpb05c3uk+Ju6T9COg9l/Xmb+HOFgCUY3liK0Vhwt+jf3XA9YLNpmpb05RQ3Jr1b6jel+Gai8iMgPRoLsAhDGit6mUopQ58IjQV7sG9jMenRWIBFZL6x3IHGgj3QWC4cjQVYBI0lh8aCPeiNda0n/Gsvc8v4e94Bi6Cx5NBYsAcay4WjsQCLoLHk0FiwBxrLhaOxAIugseTQWLAHvbGudi9V9jC3jMYCLILGkkNjwR70xrrSvXSth7llv9BYgDXQWHJoLNgDjeXC0ViARdBYcmgs2AON5cLRWIBF6I31CltEY8Ee9Ma67F+62s3csl8aaCzAEmgsOTQW7IHGcuFoLMBkt27enJ2dTbydxpJDY8EeaCwXjsYCTJaTnVVYkH/86NG40qKx5NBYsAe9sS75l650M7esnMYCzJWTnZWTnZWT/fe40qKx5NBYsAcay4WjsQCTrTVWfGnRWHJoLNiD3lgX/UuXu5lb9uPl1tyDXx376SfGmDnb2FirpbU/52NPXt758+dUF4v90FiwBxrLhaOxGDN5NFZm0ViwBxrLheN7hYDJLPC9wrpCTSusy8SjaNru8rFMPCV5NBbsYbWxuhYv+ZlbVtYwQ2MBZlL+M+91hbGBNVa+O2Uo1RUmf+tY+W7lefXq1SsaC3ZBY7lwNBZgMtV/d0NdYWwbjZXv3l1YmCKXaCwgI2gsF47GAkym+O8gTbiKtbt8bL2X1t+qvzRWvlvTFdYlfXl3eXmhtvbi2OpDbrzBYDQW7EFvrAtdixf9zC2jsQCLMKexNl5+Wnstemt8Y61fx1p/x7Hy3VphXcL1Lf1m/Z9G/1vEorFgD+uNxVyzsnoaC7AEBY21fslp7arT5o0Vc/1rrHz37vLyaGPVFUYfo7Bu42UyM9BYsAe9sc53LV5grlkpjQVYg/nfK4ztrdWXo2+NXo+KuY614U0J7cV1LCAVGsuFo7EAizD9Z96Tfttw7aLU7t1rrbR6y8afx4r5Wfj49+DnsYBkaCwXjsYCLELR391gezQW7EFvrHOdofPMNaOxAIuw3d9BahE0FuyBxnLhaCzAIvhvQsuhsWAPNJYLR2MBFkFjyaGxYA96Y53tCJ1jrtnP92kswBIs1Fi2+oktGgv2oDfWmY7QWeaa0ViARRjYWFttpsw21mb/NZ4MobFgDzSWC0djARbh2OtYNBYgaCxXjsYCLEJvrJdGuFOoFd55eadQ27Vrl/4XXN25o/+tVrvKRmNv1wrvrN//5WjZLm395s3effO7JXmrAWgs2IPeWKfbF84w16zk/jSNBViBKY1VNqq/qgfPaNkuvZf026P3uFOoFd4ZLdu1erP+0ibvXrbZ3fQHj3lUg9BYsAcay4WjsQCLMKOx9EtJ6/V0p1BvrNVLTGtvWLs5RszdNr574WZ3i348GgsQNJYrR2MBFmGBxoqpotjrWC83vDHu3cs2uxuNBcTSG+tU+8Jp5prRWIBFqGwsbeOPTCX8PJamfxMw6btvdrf1j7f6Afh5LLgajeXC0ViARRjYWKmtV5Et0ViwB72xTrYvnGKuWfE9GguwBBpLDo0Fe3iz8vaDww2+tnnlv/Az0/btjYkvzsd/eQJgPmWNZXM0Fmzj7yXtxfdmlP/Cz0xb4dnglZYp1ecdABpLEo0F2yitHfns8tDJtnnmkmWXdnWPR1SfdwBoLEk0Fmyjf+rJ3pIOb6v6X/uZCSu+P/Pfx1rfrLxVfd4BoLEk0Viwk6PVD764PORT/cs/M3reVi5iARZiucaK+9vhrYrGgp28WXn71x9bjtRO+NrmmVPnbX302aXB7yoHVJ9uAFZZrrF0NBaQWZMLv+WWdf7jbF9F8yNf6zxz2H5umM0u7fqucoDvEgLWYbnGWv1b3I39LzpvH40FW7rY9PA/j7bmVnR/cn7gx9sPi+9NM/vu+N2p72snC8/0ZZd2/dexVr5FCFiNJRuL7xUChgktv2waCJ28O+7x+pnd98np3vMNk93jkecvV1SfWQDi0VhyaCwAAJCK5RtrtGyXFb9jSGMBAIBULNpY0f+ic1n0PwVtLTQWAABIxXKNtdFo2S4LXsR6SWMBAIDULN5YlkVjAQCAVGgsOTQWAABIhcaSQ2MBAIBUaCw5NBYAAEiFxpJDYwEAgFT0xnqBLZqZmaGxAADApmgsOTQWAABIhcaSQ2MBAIBUaCw5NBYAAEiFxpJDYwEAgFRoLDk0FgAASIXGkkNjAQCAVGgsOTQWAABIhcaSQ2MBAIBUaCw5NBYAAEiFxpJDYwEAgFRoLDk0FgAASMUijTVcukvTNE3TDtx58eLOAW1X6bDqp5QajQUAAFKxSGO9ePHizgHtwJ21l2gsAABga9ZrrOglrbXk0t+ms0x70VgAACCV4eHh8fHx3y3g9gHtwO21l3aVDie7z3DprrU7KUZjAQCAVGzSWLfXLmRpNBYAALABWzRW9E1cxwIAAPZgkcZa/3OFt3+PXrVar6m1y1i7dtFYAADADizSWLZDYwEAgFRoLDk0FgAASIXGkkNjAQCAVGgsOTQWAABIhcaSQ2MBAIBUaCw5NBYAAEiFxpJDYwEAgFRoLDk0FgAASIXGkkNjAQCAVGgsOTQWAABIhcaSQ2MBAIBUaCw5NBYAAEiFxpJDYwEAgFRoLDk0FgAASIXGkkNjAQCAVGgsOTQWAABIhcaSQ2MBAIBU7NBYtw9oB24bcmd5NBYAAEjF7Ma6fUDbVTq85fehsQAAgK3QWHJoLAAAkIreWM+N8+DnXZpu188P1l/xeDzrNz9//vy2R9u1a1fMDbHvqWme2/p9kr3Lrp8fJLmzwWgsAACQitGNdduzMXlue6INpXvw8y7Nc3v99tXXo/+b5DHi3yXlnQ1CYwEAgFTMu461fvFJD6PoVSltNZg2RlJMK0Vf3OxdNnnRSDQWAABIxfDGWrOeTrt+fhCTQusXpTY21oOfd63G2NpFqs3fJcmdjUZjAQCAVEz4XuGGH6JauyH681i7diVvrPV3Xb1Hwg0brlgl3NlgNBYAAEjFtOtYDkNjAQCAVGgsOTQWAABIhcaSQ2MBAIBUaCw5NBYAAEiFxpJDYwEAgFRoLDk0FgAASIXGkkNjAQCAVGgsOTQWAABIhcaSk8nGev5ypX/qyfmGSeaAtQ8vzYZ/3/YnprFCyy/bh5eUHyuWkfVPPXn+ckX1OWWs/qkntf455YeabX93A/PDs09Vn1DmobHkZKaxQssvc8s6PzjcsLeko/BM3+eXBr+48oDZd4Vn+nLK/X/9qfXP3zd1j0cy9EmaSd3jkT9/3/SXI8055f7CM33Kjxjbzj6/NFh4pm9vSccHhxtyyzpDyy9Vn18Z9mblbUXd2O6v7u0t6cg/2fvpBb5C2nv/ONef5+v5qLj9T1/XX2x6qPr8MgONJScDjXWn99GeovYfbk5c9C9eD0Ru9j2u7We2X1UgfK1nqaxxNru067vKgTcrbzP32botz1+ufFc5kF3aVdY4e61nqSoQVn6s2PZ3s+/x9UDkon/xh5sTe4ra7/Q+Un2iZczw7NO9J9o/vTBwrjP0a2/4Bl8hHbGavkhlb/hU2/w/zvY58jcGcWgsOdttrGtt07kV3b6WeX6pc+Ru9EXOd4W+vDp86FRPRj9h5eWWdX55dfh8V+hGX0T58WEZX1Ug7GuZz63ovtY2rfpcy4Dh2ad7T3QU35v+tZevkM7clZ6lI7UT2T93PHn+WvXpZiAaS862Gms2/Pt/H2873b5ws+8xc/Cudi95TvXe6JrN9Kftll1seviPs31Xu5eUHxNm6E63L/z38Tbr/0Rgam9W3u490V58b7omqP6QMuN2PRD5tmbsk9O9qs84A9FYcrbVWLllnUdqJ6qDEeWnODN6p9rm//Noq9rr4XrTn2qbV340mNGrDkaO1E7klnUqPN+2r6Ju7NMLA5U9YeXHkxm9i12LFvmNqEFoLDnyjTU8+/Sj4var3Us3+h4zx+96IPLZ5cHS2hEDPnnTVVo78tnlweuBiPKjwUzYle6lj4rbbf1Ht/70df3ZjpDyI8lMWE3w8c/3Z/Ycb1N90hmFxpIj31jXO2Y8pwI1gfCNYIS5YcV3pzxevwGfvOnyeP3Fd6eUHwdmzmoCYc+pwPWOGYWn3HZMLvz2X8fbKruXlB/JLcybp+2pXv2n8idjt13qWvyPr+ut88eDMovGkiPfWF9f7v+2eqwmGLHegvnva5qmae8X+eQewZunRck9iDdP21Ot+jhkeOc7Qn/6ut6AT950/enr+vMdIeXHIWHB/PdjzpOkJ8+tovfWbnvvq2CSs4XzLdm+rR77+nK/wlNuO2r9c/kne6sC6g/j+kmyfnZVf6jlfbvZiZTO6cRJm7BrPba/8pqCdRvrtkfz3Fb9JDYl31h7jrd5m+eUn9bxu1X0nrYj/1bCy1tazBejb/doH3pV/0tZY9e6l/5ypFnVj2SFll/+5Ujzte4l5cchfreK3ns/78P31860xJNnw3kYzN+T8AsS59smK6ufUXvpdDuO1Tz497UR5cdwfRlvLE7ajasOhPN8PXcD86pPPUPojfWbaWo9mqdW/p61Hm1nyVDGn9XWTU9PSzbWX39sOdO2oPy0jpvvqx0brhNEv2S8v+O9DVcR1q51acm+Oqx/+Qjm6792rn/RWfvatH5lYkf+rYRX0/y4qR9E9cGMW2VvWHljXQ+ElR+HpKfc+omXcPJ8uyfZtSvOt3SObdOcfRvr+8rBH26MKz+GyU6zmPMq7gzZ0Fh8kdzyaCwFnN1Y1cGIpXZ4j/ahN+YWb572fpFX/2cwUn2r6D0t73Aw4v1qx3tfBav1W/Q3BTe+V8xlcK9+y57q6mCkOlj9oZZ3OOEDJfm4e6qr3/Vx81I/iMV2zQKN9WsgrPw4bFww7/0debdiTqSEk+fd/7dyvm0yuzfW9zfGlR/D5KeZpmlJvxJGT6Q91RvepOUd5qRNYzSWvKGSnavn086SobVyqvVoO3fuXL91w/00va1WG2v9dk/tZi//luwBjeW0xlr//Iz7NE745I/7WhP/5SMaXps8QnX0t1PrXyASvty88+OmfhCLjcZKspgftNK0HXm3kpw8h/doG87JxHG+bTIaK5OLPc02O0NiTqSYmln7jQQn7btGY0mLvxq13lglQ7/pBbVWUqv3W3uPWo9eUqvNpL+09o4bbtc8tQkPaDSnNVb1raL3tOiXg+oPo7/sbfw0jk+xzb8Yeb/aseELQcJv6ZL/Xm2TLx+bfdx3/IbPGqOxEhf7f+jqy4knz4ZzMpi3J9l1U863ZKOxMrlkjZXiN6Wrp2Kyk5CTdrPRWPKi15v0Boo21saiikmxDY1V64lN8/WWirn/UMnOnSUl8Q9otG011um2hapgxHoL5q1+Oz/vG/0Wb562p7oqGKkKVn+4emP0Ppr2flFF3CNsvAxesfqO+qs73tPyvglGvtmz4Q5xr65+xHd93LzUD2KxXbVGYyk/DhvPtB15t9ZevVX03vtFFUlOng1n1HtfBeMfh/Ntk3nt31jKj+GG02z9/+hNvhJuOJHW3/ShN9mjcdImjMbavg0xldBY69elNruOFX2UtetYq48QvY5lq8aarwqEmUt2tUf9nyv8tVf9cWCmzds0a+/GqhlXfgyZmaOxpK1fiEp5HSv2jpv9PJa2s2Ro7W5Jfh7LXo11PRC2/6r+r7bBe18FVD8lK+6KBRqrslf9cdj2ON/SnQMaS/kxzNA4adMajWWe+CtXFkVjsXRHYzGTR2Mxe43GMlzcHz+0PBqLpTsai5k8GovZazQW4myrsU61zv/aG2Yu2RUr/D3vPeqPAzNtFY22byzlx5CZORoLcWgslu5oLGbyaCxmr9FYiENjsXRHYzGTR2Mxe43GQpztNlZlb5i5ZJct0FhXe9QfB2ba7N5Y39WMKz+GzMzRWIiz7cbqWWIu2WX/ovrG6lZ/HJhpc0JjqT6GzMzRWIizrcY62Tp/rWeJuWSXLNBYV7rVHwdm2n6xf2MpP4bMzNFYiENjsXRHYzGTR2Mxe83xjfUMW0RjsXRHYzGTR2Mxe43GQpztNVbL/NXuJeaSXbRAY132qz8OzLT90mD7xlJ+DJmZo7EQh8Zi6Y7GYiaPxmL2Go2FONtqLF/L/JXuJeaSWaGxLvnVHwdm2srt31jKjyEzczQW4tBYLN3RWMzk0VjMXqOxEGe7jXW5e4m5ZBcs0FgX/eqPAzNtdm+sb2vGlR9DZuZoLMShsVi6o7GYyaOxmL1GYyEOjcXSHY3FTB6Nxew1GgtxttVY3pZHl/yLzCU732WBxupSfxyYaStrmLF3Y1WPKz+GzMzRWLYwWLJT21kyaMrHorFYuqOxmMmjsZi9RmMZq7ZgtY2iL8gaLNlpTmXRWCzd0VjM5NFYzF6jsYyVucZ69qy2QCuozczTSmW7jXXRv8hcsnMWaKwLXeqPAzNtDmgs5ceQmTkaa1tqC7SdO3dqmqZpq/1TW6C/pu0sGXw2WLL6tnUFtes3FtSuP8LOksHYR0vaY7UFZlzJ2l5jNT+62LXIXLJzndZoLOaaldXbv7FUH0Nm5misbVm/OhV/nWqwZKdWUJt4HWv9W376S7HvF3159Z3jDZbsNOFC1rYaq6L50YWuReaSWaGxzqs+CMzMldq/sZQfQ2bmaKxtWf/2XbSdoheytKSNFfNmTdMKamO/Abj+cvJvC9JYzFqjsZjJo7GYvebsxhobG3tqqJsFWsHN2JeiNwye2KkV3Hx6s0DbeWJQf/vOE4NPnw6e2KnfkPAISR5t/d1Wb93wrgaZmpqisVhao7GYyaOxmL1GY23LzZiLVjc33LJz58616NLfGn1h8ET0h7R2nhjcQmPF3tVA222s850h5pKd7Qgpb6xzqg8CM3N2b6zD1WPKjyEzczTWtpiUPU+fJl4AMwyNxdIdjcVMHo3F7DUaa1vMaqzBEzs1cwqLxmLpj8ZiJo/GYvYajYU422qsX5ofnesMMZfsjAUa66zqg8DM3M/2byzlx5CZORoLcbbXWE2PznWEmEtmicZSfRCYmfv5vv0bS/UxZGaOxkKc7TbW2Y4Qc8lOW6Cxzqg+CMzMOaCxlB9DZuZoLMShsVi6o7GYyaOxmL1GYyEOjcXSHY3FTB6Nxew1GgtxttVY5U1zZ9oXmEt2un1BeWOdVn0QmJkruT9t78aqGlN+DJmZo7EQh8Zi6Y7GYiaPxmL2Go2FONttrNPtC8wlO2WBxjql+iAwM2f3xvqmakz5MWRmjsZCHBqLpTsai5k8GovZazQW4myrscoa5061LzCX7KQFGuuk6oPAzFzxPXs31tfXR5UfQ2bmaCzEkW8sj9f/0+2Hys9pZtpOti18cLjh+csVAz5/3+35y5UPDjecbFN/HJhpO3Jr8pPTvUrOt+07Vz956Fy/8mPITNvJtoWccn/78JLqU88QNJYc+cY6eXf8kwuDyk9rZtpK6mf2HG8z4JM3XXuOt5XUzyg/Dsy0fXJh8OTdcYWn3HZ0j0eyS7v4XYF7drJN5ZV+o+mNtYwtkm+s9uGlnHK/r23+JHPH/qdy5PvKQQM+edP1feXg/1SOKD8OzJz52uZtfVUgeuVV+ZFk5qy8ee6Dww2qzzuj0Fhy5BvryfPXfznSXNHySPmZzUyYr3U+t6K7aSBkwCdvuu4G5vN8Pb5W9UeDmbCKlkd/OdL85PlrhafcNv29pP3onYfKjyQzYb62+a+uDX99uV/1SWcUGkuOfGMJIW50zXpO9fIbNTfscPWYFX4yxuP1f39jXPnRYMZvwXOq90bXrOozblsmF37be6KjopnfiDp/PzfMfFTcbuvfEqRGY8nZVmMJITxe/+HqMV/bPHPwyhrn/na01QpfPkLLL//zaGtZ45zyY8IM3eHqMfv+icJYp+9P/ONsn1f18WTGrnU+p9zf0L+g+nQzEI0lZ7uNFVp+mVvW+emFAV/rPHPevC2Pvqke+9vR1q6xcEY/YeV1jYX/drT1m+oxb8sj5ceHGbFPLwzklnWq+hOsmfVm5e13lQPZpV0/N8woP7DMiB2vm/qouP1840PV55qxaCw5220sXUXd2EfF7YVn+o7cmihtnPW1znuZbedrna9oefTj7YefXhrMrej+5HRv9ArW7Ozsyps3Gfh83Z4nz19/cro3t6L700uDP95++EvzI3eecsU3AhVNM8qfxvbna50vbZw9cmui8EzfR8XtFXVjqk+xDIhEIs+ePtVf7h6P/Nex1sIzfV9fHz1xf9rXtqD8mLNt7vjd6a8qRzynAntPtA/PPlV7spmAxpKTmcYSQgzPPj3fMOnx+v/8fdPur+4xu8/j9ZfWjsT+kPuLFy9ysrNOFBdZIbOEEE0DodLaEY/X/6ev65UfLvP3H1/cyMnO+n8HTyh/JhnZn79v8nj95xsmnfHL1dDgYN7+3PLS0ugtz1+unG+Y/Ppy/57jbcqPNtv+/l7S/n3l4PWOmTcrbxWeaaahseRkrLHgBmdPn7ZUZrlZJBLJyc66eaNG9RNBPD2wCj0Fs7P2/pl9IIrGkkNjYWvILIugsayJwIIj0VhyaCxsGZllBTSWBRFYcCoaSw6NBRlklnI0ltUQWHAwGksOjQVJZJZaNJalEFhwNhpLDo0FeWSWQjSWdRBYcDwaSw6NhW0hs1ShsSyCwIIb0FhyaCxsF5mlBI1lBQQWXILGkkNjIQPILPPRWMoRWHAPGksOjYXMILNMRmOpRWDBVWgsOTQWMobMMhONpRCBBbehseTQWMgkMss0NJYqBBZciMaSQ2Mhw8gsc9BYShBYcCcaSw6Nhcwjs0xAY5mPwIJr0VhyaCwYgswyGo1lMgILbkZjyaGxYBQyy1A0lpkILLic3lhPsEU0FgxEZhmHxjINgQXQWHJoLBiLzDIIjWUOAgsQNJYsGguGI7OMQGOZgMACdDSWHBoLZiCzMo7GMhqBBUTRWHJoLJiEzMosGstQBBYQi8aSQ2PBPGRWBtFYxiGwgDg0lhwaC6YiszKFxjIIgQUkorHk0FgwG5mVETSWEaUwtdIAAB9qSURBVAgsICkaSw6NBQXIrO2jsTKOwAI2Q2PJobGgBpm1TTRWZhFYQAo0lhwaC8qQWdtBY2UQgQWkRmPJobGgEpkljcbKFAILeCcaSw6NBcXILDk0VkYQWEA6aCw5NBbUI7Mk0FjbR2ABaaKx5NBYsAQya6torG0isID00VhyaCxYBZm1JTTWdhBYwJbQWHJoLFgImZU+GksagQVsFY0lh8aCtZBZaaKx5BBYgAQaSw6NBcshs9JBY0kgsAA5NJYcGgtWRGa9E421VQQWII3GkkNjwaLIrNRorC0hsIDtoLHk0FiwLjIrBRorfQQWsE00lhwaC5ZGZm2GxkoTgQVsH40lh8aC1ZFZSdFY6SCwgIzQG+sxtujhw4c0FqyOzEpEY70TgQVkCo0lh8aCPZBZcWis1AgsIINoLDk0FmwjaWZ1dnREIhGFz8pkkUhkdHR0dHS0u7s7JzvrzOlT+qsPJydVPzWVGuvrX7x4EX2VwAIyi8aSQ2PBTuIyq7GxIW//vjOnTqp+Xub5/LNPPfl5hR7PgYKCnOzs/NzcQo+n0OPJzfnYtZn14sWLgvy8//nySz2zCCwg42gsOTQWbCaaWfX37/3jwIGc7KwDBfmqn5R57tbdKcjbn5OdFbd//fMz1U9Nmfb2Nk9+Xk521v98+WWgt5fAAjKOxpJDY8F+zp4+/XF2Vt6+HD0vCj2e0dFR1U/KJCtv3hw84IkLrMKCgmAw/tPYPX74/rvoodj3cfaBAgILyDAaSw6NBftpbGzIy90XGxmu+nZh4qUsN1/E0r9RGHs0vvj889ifzQKwfTSWHBoLNtPY2KB/izB2rvp2YdylLJdfxIp+ozB20Z/NApARNJYcGgt2EgwG9u/7OPGnkVz17UIhxN26O/n793MRS2z8RuH6dwyzs7784p+qnxrgHDSWHBoLdvLixYvmpqbD//u/+Xn78zd+v+yUz6v62Zln5c2bQk9BTnZWfm6umy9ivXjxIm9/bvQc+Dg7q7CgIH9/bkV5uauaGzAajSWHxoItPXv6NBpbufs+zsnOyt2X46q/nrSq6npOdlahp0D1E1Hp2tUr+7KzP87O8uTn6Wnl5uIEjENjyaGxYG96bB08cCAnO+vsmdPR29+svO2fenKlZeqL8wGP1+/AldTnZGft//wn9c/ElB2reXA3MD8b/j32//39+3JysrOKjh0jrQBD0VhyaCw4xP1796J/Yn949uneE+17SzoOnAn+cHOirH7mVPOc8/Zt2eWyW4PKn4bR8zXNFd+d/uLKUJ6v568/tVbUjb1Zeav/H11//x5/TQNgAhpLDo0Fp6moG/uouL347vS1nqWbfY9r+5lDVtMXOd8V+vTCwN4T7ZMLv6k+0QAXobHk0FhwlNP3JwpPB851hGqCj2/2MQeusjdcfG/6b0dbnzx/rfp0A9xieHh4dHQ0gi2iseAckwu/7T3RcaZtQXkHMENX1Rv+tmbsk9O9qs84wC1oLDk0Fpwjt6zzp9pJrmC5YZf8i/m+nju9j1SfdIAr0FhyaCw4xGz497/+1Hq1e+lG32Pm+NUEH/9wc+KL8/xxQsAMNJYcGgsO0TQQyq3orgqEbwQjzA07277wweEG1ecd4Ao0lhwaCw5RWjvy+eUHNcGIXeb7aoemaZqmfeiN1HjztKj3i3wSD+jN0/ZUK/+XMnNXe8J/OdIcWn6p+tQDnI/GkkNjwSE8Xn/J/Wnlv/Bvad/u0T70RmqCkRpvXjSt1m9kKXe9N7y3pKN/6onqUw9wPhpLDo0Fh/B4/WX1M8p/4d/SkjVWMP/9Hfm3Yq9LVX+o5X0bjNTcKnpv9UrXjvxbCa/q9/fmae/v0G9/76tgzeoDausXzFI/iOoDsrXGCtBYgEloLDk0FhxCb6zqYMRGO7xH+9AbqQ5Gqjd+r9Cr37KnujoYqQ5Wf6jlHY69c9z7BtceYU91tTdv9d1vFb2n5R0ORrxf7Xjvq2C1fsv7RXmpH8RW+5XGAsxCY8mhseAQtm8svY1ia2ljY1VHrzmtV1RCkyUrsxh5h1M/iK1GYwGmobHk0FhwCMc0lverHRtqae2KVJL3in11k8Zav4612YdO9qotRmMBpqGx5NBYcAi9saqCEbusIubPFVZt/F5hRTBSFaz+cPXVHe9ped8EI9/s2XCHuFervHnanurVf66+e943wUhVMJj3/vo981I/iK1GYwGmobHk0FhwCI/XX3Z/pioQZi7Zr/y5QsAsNJYcGgsO4fH6S+/PXA+EmUtWSWMBZqGx5NBYcAgay22jsQDT0FhyaCw4BI3lttFYgGloLDk0FhxCb6xfe8PMJbvWQ2MBJtEbK4wtorHgEDSW20ZjAaahseTQWHAIGstto7EA09BYcmgsOITH6//5/nRlzxJzya52L9FYgDloLDk0FhxCb6xrPUvMJbtCYwFmobHk0FhwCBrLbaOxANPQWHJoLDgEjeW20ViAaWgsOTQWHMLj9f98b/pq9xJzyS77aSzAJDSWHBoLDkFjuW00FmAaGksOjQWHoLHcNhoLMA2NJYfGgkN4vP6Se9NXupeYS3aJxgLMQmPJobHgEDSW20ZjAaahseTQWHAIvbEudy8xl+wijQWYhcaSQ2PBIWgst43GAkxDY8mhseAQNJbbRmMBpqGx5NBYcAi9sS75F5lLdrFrkcYCzEFjyaGx4BA0lttGYwGm0RtrCVs0OTlJY8EJaCy3jcYCTENjyaGx4BAer//EvemL/kXmkl2gsQCz0FhyaCw4xGpjdS0yl4zGAkxDY8mhseAQemNd6FpkLtl5GgswC40lh8aCQ9BYbhuNBZiGxpJDY8EhaCy3jcYCTENjyaGx4BAer7/47tT5zhBzyc51hmgswBw0lhwaCw5BY7ltNBZgGhpLDo0Fh6Cx3DYaCzANjSWHxoJD6I11riPEXLKzHTQWYBIaSw6NBYfQG+tsR4i5ZGdoLMAsNJYcGgsOQWO5bTQWYBoaSw6NBYegsdw2GgswDY0lh8aCQ3i8/qK6qTPtC8wlO92+QGMB5qCx5NBYcAgay22jsQDT0FhyaCw4BI3lttFYgGloLDk0FhxCb6zT7QvMJTtFYwFmobHk0FhwCBrLbaOxANPQWHJoLDiEx+s/Wjd1qn2BuWQnaSzALDSWHBoLDlFaO/LZ5QfKf+FnZu4vR5pDyy9Vn3qA89FYcmgsOETTQCi3olv5r/rMtP3S/OiDww2qzzvAFWgsOTQWHGI2/Ptff2o92TbPXLLDNeNfnI//4gXACDSWHBoLzpFb1nmkdkL5r/3MhPla5/N9PXd6H6k+6QBX0BtrEVtEY8E5Jhd+23uio6L5kfICYEbvcPXYJ6d7VZ9xgFvQWHJoLDjK6fsThacD3tZ5Xxtz5rxt88fvTv/taOuT569Vn26AW9BYcmgsOE1F3dhHxe3H66Z8rfPMYfO2zn96YWDvifbJhd9Un2iAi9BYcmgsONDw7NO9J9r3lnQcOBM8XDN+rG6q+N60U3fsxtDX3hrlT8PQ/XT74b+uDuf5ev76U2tF3diblbeqTzHAXWgsOTQWnOnNytv+qSdXWqa+OB/weP0O3v5/HcvJzvKUNil/JobuWM2Du4H52fDvqs8swI1oLDk0FmBvZ0+fzsnOikQiqp8IAMeiseTQWIC90VgAjEZjyaGxAHujsQAYjcaSQ2MB9kZjATAajSWHxgLsjcYCYDQaSw6NBdgbjQXAaDSWHBoLsDcaC4DRaCw5NBZgbzQWAKPRWHJoLMDeaCwARqOx5NBYgL3RWACMRmPJobEAe6OxABiNxpJDYwH2RmMBMBqNJYfGAuyNxgJgNBpLDo0F2BuNBcBoNJYcGguwNxoLgNFoLDk0FmBvNBYAo9FYcmgswN5oLABGo7Hk0FiAvdFYAIxGY8mhsQB7o7EAGG14eHhkZCSELZqYmKCxABujsQAYjcaSQ2MB9kZjATAajSWHxgJsaXTNieLinOys7u5u/VViC0DG0VhyaCzAfkZHR3NzPi70eAo9nrx9+3Kysw8UFBR6PPl5+787fFj1swPgNDSWHBoLsKV//fOznOysuBUWFASD8Z/PALBNNJYcGguwpWAwUFhQENdY//rnZ6qfFwAHorHk0FiAXcVdyuIiFgCD0FhyaCzAruIuZXERC4BBaCw5NBZgY9FLWQfy87mIBcAgNJYcGguwsWAwkLdvX0521ueffqL6uQBwLBpLDo0F2JsnPy8nO6ulpVn1EwHgWDSWHBoLDrWyIsbHRWOj8PnEN9+If//bqfs5Py8nO+vZl18qfyYGrrhYXLkiOjtFKKT6xALciMaSQ2PBiaamREmJKC0VZ8+KhgYxNCRGRpy6Zz09wdqbyp+GsevuFjdvipMnRVGRqKwUr16pPsMAd6Gx5NBYcJaVFVFZKUpKRF2dmJsTv/3GnLPlZfHggbh0SRw/LqamVJ9qgIvQWHJoLDhLXZ04c0b094snT8SzZ8yBm58XTU3i2DGxvKz6bAPcQm+sBWwRjQUHmZsTxcUiEBBPnzInb2lJVFUJn0/1CQe4BY0lh8aCgxQXi7o6EQ6rjwBm9MbGxMmTwu9Xfc4BrkBjyaGx4BShkCgqEhMTYnmZuWJ1dVzKAsxBY8mhseAUwaCoqBChkHjyxJm7ka/l31D/NKyzvj7x3XeqTzvAFWgsOTQWnOLGDXH1qnj82L6bLtqhaZqmaYdqHouafG3NH4v6xOPHoiZfy69J66HSv6etNzEhjh0T4bDqMw9wPhpLDo0Fp/D5RFOTiERsvcY87VB1REQiojpP21E0HYmISPUhbYcvGBHVeVpetfJnaKE9eiRKSvhLHAAT0FhyaCw4hc8n2tpEOGzrNeZph6rCIhwWVXnajqLp2Bur8rS8qtV/hsMiXHVIy2sMh0U44NsRveaV1xiOueeOHX9cvRIWEOGwCBT9cfVuO3wB9f+y2938PI0FmIPGkkNjwSl8PtHaKpaWbL3G/dqhqiWxtCSq9ms7jk8vLYmlqkPaDl/vkqjar+2vWv3n6u37G5eWpo/viLtl/Z76I/Qe/6O2vzH2wZ0xrmMBZqGx5NBYcAq9sRYXbb3G/dqh64ticVFc3x+9NrV+y/7rq/9cXBSL1w9p+xtj32Xtls3uKXqOrV7H+sOxadX/phnY3ByNBZiDxpJDY8EpfD7R0iJCIVuvMVc7dD0kQiFxPVf7w7Hp2Ldez9Vyr6/+MxQSPcf+qOU2hkLTx/7wx2M9IhQSoeuHtNzGxHtGb0/8KLbe7CyNBZiDxpJDY8Ep7N9Y08f+sHbhavPGCl0/tHot6g9/XC2ntVs0TUvZWI25a/eKe2SbjsYCzEJjyaGx4BR6Yy0suHf+o3/8w9Fp5U/DtM3M0FiAOWgsOTQWnEJvrPl5163rp7U/LfgHX5fqJ2PmpqdpLMAcNJYcGgtO4fOJ5mbx6BFzy6amaCzAHDSWHBoLTkFjuW00FmAWGksOjQWn0Btrbo65ZQ8f0liAOWgsOTQWnEJvrNlZ5pbRWIBZaCw5NBacQv/vFc7MMLdscpLGAsxBY8mhseAUemNNTzO3bGKCxgLMQWPJobHgFDSW20ZjAWahseTQWHAKn080NoqpKeaWjY/TWIA5aCw5NBacQm+shw+ZWzY2RmMB5qCx5NBYcAq9sSYnmVs2OkpjAeagseTQWHAKn080NIiJCeaWjYzQWIA59MaaxxbRWHAKvbHGx5lbNjxMYwHmoLHk0FhwCr2xxsaYW0ZjAWahseTQWHAKn0/U14vRUeaWPXhAYwHmoLHk0FhwCr2xRkaYWzY0RGMB5qCx5NBYcAoay22jsQCz0FhyaCw4hc8n7t8Xw8PMLRscpLEAc9BYcmgsOIXeWA8eMLdsYIDGAsxBY8mhseAUemMNDTG3rL+fxgLMQWPJobHgFD6fuHdPDA4yt6yvj8YCzEFjyaGx4BQ0lttGYwFmobHk0FhwCr2xBgaYWxYM0liAOWgsOTQWnEJvrP5+5pbRWIBZaCw5NBacwucTd++Kvj7mlgUCNBZgDhpLDo0Fp9AbKxhkbllvL40FmIPGkkNjwSl8PlFXJwIB5pb19NBYgDloLDk0FpxCb6zeXuaWdXfTWIA5aCw5NBacQm+snh7mlvn9NBZgDhpLDo0Fp/D5xJ07orubuWVdXTQWYA4aSw6NBaegsdw2GgswC40lh8aCU+iN5fczt6yzk8YCzEFjyaGx4BR6Y3V1MbeMxgLMQmPJobHgFD6fuH1bdHYyt6yjg8YCzEFjyaGx4BQ0lttGYwFm0RvrEbZofHycxoIj6I3V0cHcsvZ2GgswB40lh8aCU/h84tYt0d7O3LK2NhoLMAeNJYfGglPojdXWxtyy1lYaCzAHjSWHxoJT+Hzi5k3R2srcspYWGgswB40lh8aCU9y+Lc6fFy0tzC1rahI//iiWl1WfeYDz0VhyaCw4xeCg+OUX0dQkmpuZK3bvnjhyRPVpB7gCjSWHxoJTLC+LH38UDQ2iqYm5Yr/+Ki5cUH3aAa5AY8mhseAgPp/49VfR2Micv/p6UV4uRkZUn3OAK9BYcmgsOMjysjh2TNy7JxoamMN35Yq4fFn1CQe4BY0lh8aCszQ3i4oKcfeu+ghgBq2+Xty8KU6cEM+fqz7bALegseTQWHCc5mZRXCyqqkR9PXPa7t8X586JkhIRCqk+zwAXobHk0FhwonBYlJeLoiLh84kLF0R1tYM3e+7cnaNHlT8NY1dVJU6dEuXl4ocfRF2dWFlRfYYB7kJjyaGx4FyhkOjuFjduCJ/Pwbv4ry9ysrMipaXKn4mxa2wUIyN8fxBQgsaSQ2MB9nb29Omc7KxIJKL6iQBwLBpLDo0F2BuNBcBoNJYcGguwNxoLgNGGh4eHh4fnsEU0FmBvNBYAo9FYcmgswN5oLABGo7Hk0FiAvdFYAIxGY8mhsQB7o7EAGI3GkkNjAfZGYwEwGo0lh8YC7I3GAmA0GksOjQXYG40FwGg0lhwaC7A3GguA0WgsOTQWYG80FgCj0VhyaCzA3mgsAEajseTQWIC90VgAjEZjyaGxAHujsQAYjcaSQ2MB9kZjATAajSWHxgLsjcYCYDQaSw6NBdgbjQXAaHpjzWKLaCzA3mgsAEajseTQWIC90VgAjEZjyaGxAHujsQAYjcaSQ2MB9rPy5s3omhPFxTnZWd3d3fqroYUF1c8OgNPQWHJoLMB+Zmdnc7KzCj2eQo8nb9++nOzsAwUFhR5Pft7+//3636qfHQCnobHk0FiALR0/ejQn++852VmxKywoCAbjP58BYJtoLDk0FmBLs7OzhQX5cY31r39+pvp5AXAgGksOjQXYVdylLC5iATAIjSWHxgLsanbjpSwuYgEwCI0lh8YCbCx6KetAfj4XsQAYhMaSQ2MBNjY7O7t/X05Odtbnn36i+rkAcCwaSw6NBdjbp4cO5WRntbQ0q34iAByLxpJDY8Ghnj8XnZ3iyhVRXCz+/W8H7+wBT0529rMvv1T+TIydzydu3xaDg6pPLMCNaCw5NBacKBAQx4+LkydFVZVoaxMjI2J+3ql7Njr6sKtL+dMwcFNTYmhI3L8vzp0Tv/wiystFOKz6DAPchcaSQ2PBWV69EmfOCK9XNDeLhQXx22/MOXv6VDx4IKqqRHGx6O1VfaoBLkJjyaGx4CyVleLCBTE0JJaXxbNnzIFbXBStreLECREKqT7bALfQG2sGWzQ2NkZjwSmmpkRJiejvF0+fMicvHBa3bomyMrGyovqcA1yBxpJDY8FBjh4V9++LJ0/URwAzepOT4tQp0dGh+pwDXIHGkkNjwSlCIVFUJB4+FMvLtpimaQ7+cGbs/n3h86k+7QBXoLHk0Fhwiu5u4fOJcFg8eWL+NE1L8Wo676LfEiVxY+qHSucpbfWeitffL777TvVpB7gCjSWHxoJT/PqrqKoSjx8rmaZp23+X2FuiL6d/Y+qHkniGVt/Dh6KoiJ98B0xAY8mhseAUPp9oahKRiJJpmpb46oaLSTFvSrwx9YOkeeNmt8S+S+LtiU8pnSev6jhv2Py8KCkRU1OqzzzA+WgsOTQWnMLnE21tIhxWMk3TEl+NvXGzW7b0IKlv3OyW2HdJ5ymlc09LjMYCzEJjyaGx4BQ+n2htFUtLSqZpWuKrsTdudsuWHiT1jXG3rF9z2uJTSnF74gdSuUePaCzAHDSWHBoLTqE31uKikmmalvhq7I2b3bKlB0l9Yzq3pPOUUj/V1dJSdJw3bG6OxgLMQWPJobHgFD6faGkRoZCSaZqW+GrsjZvdkvQFuRs3u8NWn1KKp7rZg6vZ7CyNBZiDxpJDY8EpVDfW+vfm3lVUsfdM/aYt3SjSaKzNnkA6Tz7pR6SxADegseTQWHAKvbEWFpj0NE1T/hy2sJkZGgswB40lh8aCU+iNNT/Ptrr1C1Sqn8nWNj1NYwHmoLHk0FhwCp9PNDeLR4+YW6b/J8BpLMB4NJYcGgtOoTfW3JyNpmla0htjb0+8j35L3O2pX03zY6XzOBbaw4c0FmAOGksOjQWnsFJjae+SWDBxb0qsnHReSNFG6XwskRBwNBYAQWPJorHgFHpjzc5afJqmJX35nbckvhB9dUO9JdyYwY9lrdFYgFloLDk0FpxC/+8VzsxYfJqmRV9YbaCYlze0Udr3iXvwpLe883GSPrfE+1hok5M0FmAOGksOjQWn0BtretoiS9Ioa7fH3ifxvVLfkvoOsR8o7q3pPLJ+S+pnaKFNTNBYgDloLDk0FpzCeo31ztZJfHn7jfXOF9L/WElvsdBoLMAsNJYcGgtO4fOJxkYxNWWRaZqW9NXY21cvHSW8NXp70pfXL4xtfmPsQ23pY6X+t7DWxsdpLMAcNJYcGgtOoTfWw4cWmaZpSV+NfSHpjbEvxN4n7jET3yXpy4mPk+YHTaT8kMZvbIzGAsxBY8mhseAUemNNTlpkSRpl7fbY+8TeOXpL0vvH3SHxQeJeTvruaX6sFA9ooY2O0liAOfTGmsYW0VhwCp9PNDSIiQmLTNO0d94efVnuhRQPuM0P8c5/C0tsZCRpYz17+vTCuXON9fVKTkPAkWgsOTQWnEJvrPFxi0/TtMSXk39vLuY+m72a+L6bfbj0P9Zmz9ZyGx6Oayy9rg4U5O/Lya4oL1d4MgIOQ2PJobHgFHpjjY1ZdutBE/Nq9OXEOyfeJ/Zu0Vfjbky8Q5ofK/WbrLiYxorWVe6+j3Oysz7OzqKxgAyiseTQWHAKn0/U14vRUeaWPXggSkqeDQ7G1pU+GgvILBpLDo0Fp9Aba2SEuWVDQ4dyc/Siytm4j7Oz9iXcyBjbznzeCtXFYj80FpyCxnLbhobOfPrpwfz8/Tkf52T/PfYXg4+zsw4dPHjsp58YYxnZN19/ffPmDdXFYj80FpzC5xP374vhYeaWDQ7qP481Ozt7/OjRwoL8aGnxvUIgs/heoRwaC06hN9aDB8wtGxiI/XOFsaVFYwGZRWPJobHgFHpjDQ0xt6y/P/Hvx9JLa/++HBoLyCAaSw6NBafw+cS9e2JwkLllfX2b/T3vs7Ozs7Oz5p+DgFPRWHJoLDgFjeW2bd5YADKLxpJDY8Ep9MYaGGBuWTBIYwHmoLHk0FhwCr2x+vuZW0ZjAWahseTQWHAKn0/cvSv6+phbFgjQWIA5aCw5NBacQm+sYJC5Zb29NBZgDhpLDo0Fp/D5RF2dCASYW9bTQ2MB5qCx5NBYcAq9sXp7mVvW3U1jAeagseTQWHAKvbF6ephb5vfTWIA5aCw5NBacwucTd+6I7m7mlnV10ViAOWgsOTQWnILGcttoLMAsNJYcGgtOoTeW38/css5OGgswB40lh8aCU+iN1dXF3DIaCzALjSWHxoJT+Hzi9m3R2cncso4OGgswB40lh8aCU+iN1dHB3LL2dhoLMMfw8PCDBw+msEWjo6M0FhyBxnLbaCzALDSWHBoLTuHziVu3RHs7c8va2mgswBw0lhwaC06hN1ZbG3PLWltpLMAcNJYcGgtOceaMqKkRra3MLWtpobEAc9BYcmgsOMXt2+L8edHSwtyypibxww/i+XPVZx7gfDSWHBoLTjEyIsrLRVOTaG5mrti9e+LIEdWnHeAKNJYcGgtOsbwsfvxRNDSIpibmilVWigsXVJ92gCvQWHJoLDjImTPi2jXR0CAaG5nDV1/PD2MBpqGx5NBYcJDnz8Xx46KuTjQ0MIfvwgVRU6P6hAPcgsaSQ2PBWQIBUV5OZjl59fXi2jVRVCRWVlSfbYBb0FhyaCw4TiAgfvpJXLok7t8X9fXMUaurE16vOHOGP04ImInGkkNjwYlevRKVleKbb0RJiTh1Sly4IC5eZDbe2bPC5xNFReK770TCFywARqOx5NBYcK6VFTE1pf6ns1lG1t0tQiHVpxTgUjSWHBoLAACkQmPJobEAAEAqU1NTwWDwIbZoeHi4r68v7mDSWAAAYFU4HO7p6VFdLPbT398/Pj4edzBpLAAAsGplZaW1tVV1sdhPT09POByOO5g0FgAAWOf3+0dHR1VHi51MTk52dHS8fv067kjSWAAAYN2zZ8+6urpUd4ud9PX1TU9PJx5JGgsAAGwwOTnZ39+vOl3sYWRkpKenJ+lhpLEAAMAGb9++HRgYCAQCExMTqhvG0vr7+/1+/6tXr5IeRhoLAAAksbCw0NHREQwGh4eHia2oycnJ0dHRYDDY2dk5OTn59u3bzQ4gjQUAAJJ7/fr11NTUwMBAe3t7E5qampqaWlpaAoHA1NTU83f911RpLAAAgMyjsQAAADLv/wOv6l1gWRBzHwAAAABJRU5ErkJggg==" alt="" />

PluginModel模型

将需要动态生产,并且后期可能发生改变的插件持久化到数据库,文件,Nosql中,程序使用时,直接从存储介质里读取即可

    /// <summary>
/// 插件模型
/// Author:Lind
/// 可以被持久化到数据库里,方便松插拨
/// 根据数据库的值,生产对应的实例
/// </summary>
public class PluginModel : Entity
{
/// <summary>
/// 模块名称:对插件进行分类管理
/// </summary>
public string ModuleName { get; set; }
/// <summary>
/// 类型显示名称,模块下面的类型列表,一个模块可以有多种类型
/// </summary>
public string TypeName { get; set; }
/// <summary>
/// 类型完整路径,命令名称+类名
/// </summary>
public string TypeFullName { get; set; }
}

PluginManager插件管理者

没有Init(),Install()这种初始化的方法,而直接集成到了Config属性上,当没有初始化时,直接进行注册注册插件,当已经被初始化后,直接返回容器即可,这在程序部署时,变得更加自动化!

    /// <summary>
/// 可插拔组件的管理者
/// Author:Lind
/// 依赖于Autofac
/// </summary>
public class PluginManager
{
/// <summary>
/// 插件容器辅助字段
/// </summary>
private static IContainer _container = null;
/// <summary>
/// 互斥锁
/// </summary>
private static object lockObj = new object();
/// <summary>
/// 类的构造方法
/// </summary>
static PluginManager()
{ lock (lockObj)
{
if (_container == null)
{
lock (lockObj)
{
try
{
Console.WriteLine("开始注册(IPlugins)所有插件...");
var builder = new ContainerBuilder(); foreach (var item in AssemblyHelper.GetTypesByInterfaces(typeof(IPlugins)))
{
builder.RegisterType(item)
.Named(item.FullName, item.GetInterfaces().FirstOrDefault());
}
_container = builder.Build();
}
catch (Exception)
{
throw new ArgumentException("PluginManager依赖于autofac包包...");
} }
}
} }
/// <summary>
/// 从插件容器里返回对象
/// </summary>
/// <param name="serviceName"></param>
/// <param name="serviceType"></param>
/// <returns></returns>
public static object Resolve(string serviceName, Type serviceType)
{
return _container.ResolveNamed(serviceName, serviceType);
}
/// <summary>
/// 从插件容器里返回对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="serviceName"></param>
/// <returns></returns>
public static TService Resolve<TService>(string serviceName)
{
return _container.ResolveNamed<TService>(serviceName);
} }

通过这个Lind.DDD.Plugins的设计,让我们再次领略了IoC容器的魅力,当然它的基于还是接口,多态和面向对象的基本性质,所以,学好基础才是重中之重!

感谢各位的阅读,非常各位多多关注仓储大叔框架

回到目录

上一篇:HDU 4998 (点的旋转) Rotate


下一篇:JAVA传入一个字符串,返回一个字符串中的大写字母