مهدی خانزادی
۳۰ تیر ۱۴۰۵
در این قسمت ابتدا به معرفی danceable/container و danceable/provider برای مدیریت وابستگیها (Dependency Management) و مدیریت چرخه عمر سرویسها (Service Lifecycle) میپردازیم و سپس با استفاده از آنها یک وبلاگ چند زبانه میسازیم.
در قسمت های قبل با DI , Service Container و Service provider آشنا شدیم. در این قسمت با پکیج های danceable/container و danceable/provider آشنا میشویم.
danceable/container به عنوان سرویس کانتینر در گولنگدر قسمت قبل با سرویس کانتینر آشنا شدیم. در اینجا با danceable/container آشنا میشویم و یاد میگیریم چطور از آن استفاده کنیم.
در ابتدا برای نصب پکیج, به صورت زیر از دستور go get استفاده میکنیم:
سپس برای ایجاد یک کانتینر میتوانیم از متد New استفاده کنیم:
در قدم بعدی با استفاده از متد Bind میتوانیم به کانتینر بگوییم چطور سرویس مورد نظر ما را ایجاد کند:
در مثال بالا یک تابع به متد Bind پاس دادیم که یک کانکشن به دیتابیس MongoDB و یک خطا برمیگرداند. در قدم بعد با استفاده از متد Resolve میتوانیم از کانتینر بخواهیم که یک کانکشن MongoDB در اختیار ما قرار دهد:
در مثال بالا ابتدا با استفاده از متد Resolve یک نمونه از *mongo.Client را دریافت کردیم و سپس متد Ping را فراخوانی کردیم تا یک پینگ روی دیتابیس انجام شود.
با توجه به مثال بالا, هر زمان از متد Resolve استفاده کنیم, تابعی که موقع به کانتینر معرفی کردیم فراخوانی میشود و یک مقدار از نوع ایجاد میشود که درون متغیر مورد نظر ما قرار میگیرد. اگر اخرین مقداری گه تابع مرتبط با بر میگرداند یک ارور باشد, این ارور توسط متد برگردانده میشود و میتوانیم آن را چک کنیم تا مطمئن شویم عمل به درستی انجام شده است.
Bind*mongo.ClientBindResolveResolveبعضی وقت ها نیاز داریم تنها یک نمونه از یک سرویس وجود داشته باشد. در این مواقع میتوانیم پارامتر bind.Singleton() را به متد Bind پاس دهیم:
در مثال بالا از bind.Singleton() استفاده کردیم. بدین ترتیب اگر حتی چندین بار تابع Resolve را استفاده کنیم, تنها یک نمونه از *mongo.Client ایجاد و به اشتراک گذاشته میشود.
نکته ۱: همیشه به محض استفاده از متد Bind یکبار تابعی که به Bind پاس دادهایم کال میشود تا اگر خطایی وجود داشته باشد موقع Bind مشخص شود. با استفاده از bind.Lazy() میتوان به کانتینر گفت اجرای تابعی که به Bind پاس داده میشود را تا اولین Resolve به تاخیر بینداز!
نکته ۲: با استفاده از bind.Singleton() کانتینر نتیجه ی حاصل از اولین اجرای تابعی که به Bind پاس داده ایم را کش میکند و در هر بار Resolve آن را به اشتراک میگذارد.
با استفاده از متد Call میتوان از کانتینر خواست تا با فراهم کردن پارامترهای یک تابع آن را فراخوانی کند:
همچنین با استفاده از متد Fill میتوان فیلد های یک struct را توسط کانتینر مقدار دهی کرد. برای توضیحات بیشتر میتوانید مستندات danceable/container را بررسی کنید.
danceable/provider به عنوان سرویس پروایدر در گولنگدر قسمت قبل با سرویس پروایدر آشنا شدیم. در اینجا با danceable/provider آشنا میشویم و یاد میگیریم چطور از آن استفاده کنیم.
برای نصب پکیج danceable/provider به صورت زیر عمل میکنیم:
با استفاده از این پکیج میتوان یکسری provider تعریف کرد که وظیفه ی Bind کردن و مدیریت چرخه ی عمر سرویس های ما را بر عهده میگیرند.
هر پروایدر حداقل دارای سه متد زیر است:
بعد از ایجاد پروایدرها باید آنها را رجیستر و سپس با استفاده از متد Run اجرا کرد. به مثال زیر دقت کنید:
با فراخوانی متد Run , مراحل زیر طی میشود:
Register تمامی پروایدرها به ترتیبی که رجیستر شده اند اجرا میشود.Boot تمامی پروایدرها به ترتیبی که رجیستر شده اند اجرا میشود.Terminate تمامی پروایدرها بالعکس ترتیبی که رجیستر شده اند اجرا میشود.نکته: طبق مستندات میتوان ترتیب پروایدرها را با معرفی متد Order تغییر داد.
برای توضیحات بیشتر در مورد danceable/provider به مستندات آن مراجعه کنید.