آموزش ساخت Fluent API در سی شارپ

  • یکشنبه ۴ مهر ۱۴۰۰
  • بازدید ۶۵ نفر

how to create fluent api in c sharp 11182 تصویر

آموزش ساخت Fluent API در سی شارپ

در این مقاله چگونگی ساخت Fluent API (با نام Fluent Interface نیز شناخته می شود) در زبان برنامه نویسی سی شارپ را بررسی کرده ایم. توجه داشته باشید که در این آموزش از نسخه ۵ فریم ورک .NET و نرم‌افزار ویژوال استودیو ۲۰۱۹ استفاده شده است.

فهرست مطالب

  • Fluent API چیست؟
  • ایجاد یک نمونه به صورت عادی
  • ایجاد یک نمونه به صورت API Fluent
  • محدود سازی انتخاب در Fluent API

Fluent API چیست؟

Fluent API در واقع یک روش طراحی API است که در آن از Method Chaining استفاده می شود و کدهای نوشته شده به این صورت خوانایی بالایی دارند. در فریم ورک مشهور Entity نیز از این روش برای طراحی API استفاده شده است. برای مثال:

برای درک بهتر در ادامه یک مثال را هم به صورت عادی و هم به صورت Fluent پیاده‌سازی خواهیم کرد.

ایجاد یک نمونه به صورت عادی

برای نمونه ما یک کلاس ایجاد خواهیم کرد که کار آن ساخت رشته اتصال به دیتابیس است. ابتدا یک کلاس با نام ConnectionStringBuilder ایجاد کرده و محتوای آن را مانند نمونه زیر تغییر دهید:

حال می توانیم از کلاس فوق به صورت زیر استفاده کنیم:

کد کامل مثال فوق به این صورت خواهد بود:

ایجاد یک نمونه به صورت Fluent API

در این بخش مثال فوق را به Fluent تبدیل خواهیم کرد. در این نوع طراحی خروجی متدها از نوع خود کلاس است به این معنی که هر متد نمونه جاری از کلاس (this) را بر میگرداند. ابتدا یک کلاس با نام FluentConnectionStringBuilder ایجاد کرده و محتوای آن را به شکل زیر تغییر دهید:

همانطور که مشاهده می کنید، هر متد بعد از انجام کارش، نمونه جاری از کلاس را باز میگرداند تا بتوانیم سایر متدها را نیز بعد از آن فراخوانی کنیم.

حال می توانیم از کلاس فوق به صورت زیر استفاده کنیم:

کد کامل مثال فوق:

محدود سازی انتخاب در Fluent API

اگر مثال بالا را تست کرده باشید، متوجه می شوید که کاربر هیچ محدودیتی در انتخاب متدها ندارد و هر کدام را که بخواهد با هر ترتیبی می تواند انتخاب کند. مثلا می تواند فقط متد Build را فراخوانی کند که در این صورت رشته اتصال تولید شده ناقص خواهد بود. برای محدود سازی انتخاب متد در این روش، می توانیم از Interface استفاده کنیم.

در مثال بالا ما ابتدا می خواهیم که سرور انتخاب شود. پس یک اینترفیس با نام IServerSelectionStage ایجاد می کنیم که یک متد با نام ForServer دارد. بعد از آن می خواهیم دیتابیس انتخاب شود. پس یک اینترفیس دیگر با نام IDatabaseSelectionStage ایجاد می کنیم که یک متد با نام AndDatabase دارد. بعد از آن می خواهیم نام کاربری دیتابیس انتخاب شود. پس یک اینترفیس دیگر با نام IUsernameSelectionStage ایجاد می کنیم که یک متد با نام WithUsername دارد. بعد از آن می خواهیم پسورد انتخاب شود. پس یک اینترفیس دیگر با نام IPasswordSelectionStage ایجاد می کنیم که یک متد با نام AndPassword دارد. در نهایت می خواهیم متد Build فراخوانی شود. پس یک اینترفیس دیگر با نام IBuilderSelectionStage ایجاد می کنیم که یک متد با نام Build دارد.

قسمت مهم در این طراحی، خروجی متدهای تعریف شده است. برای مثال اگر بخواهیم ترتیب فراخوانی به شکل زیر باشد:

باید نوع خروجی متدها به این صورت تعریف شود:

حال مثال بالا را به این صورت تغییر می دهیم. اینترفیس های مورد نیاز:

محتوای تغییر یافته کلاس FluentConnectionStringBuilder:

اگر به کد فوق توجه کنید، متوجه می شوید که کلاس FluentConnectionStringBuilder کل اینترفیس های بالا را پیاده‌سازی کرده است. با این کار هنگامی که در داخل متد نمونه جاری کلاس را باز میگردانیم (return this)، آن نمونه به اینترفیسی که برای نوع بازگشتی متد تعریف شده است تبدیل می شود. بنابراین فقط به متد تعریف شده در آن اینترفیس دسترسی داریم. همچنین سازنده کلاس را به صورت private تعریف کرده ایم که امکان نمونه سازی از این کلاس فقط برای اعضای آن امکان‌پذیر باشد و از آن جایی که در بالا گفتیم می خواهیم اول از همه سرور انتخاب شود، پس یک متد استاتیک با نام Create ایجاد می کنیم که نوع بازگشتی آن IServerSelectionStage است و خیلی ساده یک نمونه از کلاس ایجاد کرده و باز میگرداند. نمونه ایجاد شده به IServerSelectionStage تبدیل می شود و ما فقط به متد ForServer دسترسی خواهیم داشت.

کد کامل مثال به این صورت خواهد بود:

مطالب مرتبط
ثبت نظر
ریفریش کنید!
نظرات کاربران (۰ مورد)

هیچ نظری ثبت نشده است