کتابخانه RestEase - ارتباط typesafe با API

ممکن است پروژه ای که بر روی آن کار میکنیم با استفاده از معماری میکروسرویس باشد، یا نرم افزار های خود را بصورت چند سرویس Monolith بصورت جدا از هم طراحی کرده باشیم و یا قصد داشته باشیم در نرم افزار خود از API سرویس های دیگر استفاده کنیم، در این حالت برنامه نویسان در سی شارپ معمولا از کلاس HttpClient بصورت مستقیم و یا با قرار دادن یک کلاس Wrapper روی این کلاس عملیات مربوط به رد و بدل کردن اطلاعات به سرویس های دیگر را انجام می دهند. در حالت استفاده از Wrapper بر روی HttpClient اغلب ما اینترفیس ها و کلاس های ساده ای درست میکنیم که کار خاصی بجز ارسال درخواست و دریافت پاسخ و Map کردن آن به کلاس مورد نظر ما، کار خاصی انجام نمی دهند. این کلاس ها اغلب بصورت سرسام آوری با اضافه شدن سرویس های خارجی در پروژه ی ما ایجاد می شوند. بطور مثال سرویسی داریم که اطلاعات مربوط به کالاهای یک فروشگاه را به ما می دهد و با استفاده از آن اطلاعات و ایجاد یک پروژه ASP .NET MVC MVC اطلاعات آن را به کاربر نمایش میدهیم. در مرحله اول یک Controller ایجاد میکنیم، در اکثر مواقع سعی میکنیم فراخوانی های مربوط به سرویس های خارجی را در یک کلاس دیگر انجام دهیم و نتیجه آن را در اختیار کنترلر قرار دهیم. اینجاست که سر و کله کلاس های ساده ای که فقط کارشان ارتباط با سرویسهای خارجی است پیدا می شوند. RestEast اما با ایجاد یک Interface ساده و پیاده سازی این اینترفیسها بصورت درونی، مشکل تولید کلاسهای اضافی را حل می کنید. نحوه استفاده از این کتابخانه کوچک به این صورت است که ابتدا ما یک اینترفیس تعریف میکنیم و تعاریف متدهایی که قرار است با سرویس های خارجی ارتباط برقرار کنند را در آن قرار میدهیم. در تصاویر زیر مراحل استفاده از RestEast پیاده سازی شده است. فرض شده که ما بنا داریم سرویسی ارائه دهیم که خدمات تاکسی آنلاین و پیک موتوری ارائه میدهد.ساختار Solution یک Solution به همراه سه Project از نوع Web Api ایجاد شده است که پروژه TakC.Api کار Endpoint نهایی ما را انجام میدهد و به نوعی Api Gateway هم هست. TakC.Services.BikeDelivery سرویس مربوط به پیک موتوری می باشد و در نهایت TakC.Services.Taxis سرویس تاکسیهاست. پروژه TakC.Api ارائه دهنده نهایی سرویس ها به کلاینت ها می باشد. TakC.Services.Taxis کنترلر مربوط به سرویس اکشن Get صرفا یک اکشن ساده است که آرایه ای از داده های استاتیک مدل تاکسی بر میگرداند. برای استفاده از این سرویس در TakC.Api ابتدا یک اینترفیس به نام ITaxisService ایجاد میکنیم.ITaxisService اینترفیسهمانطور که میبینیم، این اینترفیس شامل تعریف یک متد با نام BrowseAsync می باشد که لیستی از تاکسی ها را بر میگرداند. صفت Get در اینجا کار آدرس دهی را انجام میدهد و صفت AllowAnyStatusCode این اجازه را به متد تعریف شده می دهد که هر Status Code را برگرداند و صفت SerializationMethods بیانگر Serialized کردن پارامترهای ارسالی می باشد.در نهایت در کنترلر TransportationController از سرویس ITaxisService استفاده میکنیم و در اکشن GetTaxis آن را فراخوانی میکنیم. در Startup پروژه TakC.Api عمل شناساندن ITaxisService را انجام میدهیم. در اینجا ما از یک Extension Method به نام RegisterServiceForwarder استفاده کردیم که با خواندن فایل appsettings.json که به صورت زیر می باشد اقدام به Map کردن آدرس، محل و نام سرویس ها می کند.( برای آشنایی به نحوه کارکرد متد RegisterServiceForwarder به Github پروژه مراجعه کنید.)همانطور که اشاره شد، با استفاده از RestEast و تنها با تعریف یک اینترفیس ساده به ازای هر سرویس، از تعریف کلاس های اضافی که کار خاصی بجز فراخوانی سرویس ها را انجام نمی دهند جلوگیری کردیم. در واقع RestEast عمل پیاده سازی این سرویسها را بصورت توکار برای ما انجام میدهد.