برنامه نویسی

طراحی یک برنامه مقیاس پذیر با رابط در سی شارپ

Summarize this content to 400 words in Persian Lang
وب سرور PandApache3 مبتنی بر معماری ماژولار است. اما این در عمل به چه معناست؟

ماژول های یک وب سرور

اگر سرویس PandApache3 را به عنوان یک “جعبه سیاه” در نظر بگیریم، با این وجود می توانیم آن را به سه ماژول اصلی تقسیم کنیم:

وب ماژول : امکان پردازش درخواست های HTTP در پورت 80 را فراهم می کند و به سایتی که توسط PandApache3 میزبانی شده است دسترسی پیدا می کند.
مدیر ماژول : یک رابط وب برای مدیریت سرویس PandApache ارائه می دهد.
ماژول تله متری : برای جمع آوری و تجزیه و تحلیل داده ها در مورد عملکرد سرویس استفاده می شود.

این ماژول ها به صورت هم افزایی کار می کنند، اما می توانند به طور مستقل نیز اجرا شوند، که در طول توسعه بسیار راحت است. به عنوان مثال، شما می توانید فقط ماژول تله متری را برای آزمایش آن فعال کنید، بدون اینکه ماژول های دیگر مانع شما شوند. این انعطاف پذیری تست را ساده می کند و چرخه های توسعه را سرعت می بخشد.

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

ادغام آسان با رابط ها

برای استاندارد کردن رفتار هر ماژول، PandApache3 از یک رابط C# به نام استفاده می کند IModule. بیایید ببینیم یک رابط در عمل چه چیزی را به ارمغان می آورد.

الف رابط در سی شارپ قراردادی است که یک سری متدها را بدون پیاده سازی تعریف می کند. با تحمیل یک چارچوب مشترک، تضمین می کند که همه ماژول ها دارای عملکردهای اولیه یکسان هستند، در حالی که به هر ماژول اجازه می دهد تا رفتار خود را سفارشی کند.

رابط کاربری اینجاست IModule استفاده شده در PandApache3:

public interface IModule

{

Task StartAsync();

Task RunAsync();

Task StopAsync();

bool isEnable();

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر ماژول باید قادر به شروع، اجرا و توقف باشد. روش isEnable() برای بررسی اینکه آیا ماژول مطابق با پیکربندی سرویس فعال شده است یا خیر استفاده می شود. با پیاده سازی این رابط، هر ماژول تضمین می کند که به این ساختار احترام می گذارد.

اجرای مثال برای ماژول تله متری:

public class TelemetryModule : IModule

{

public async Task StartAsync()

{

// Initialiser la collecte de données

}

public async Task RunAsync()

{

// Collecte en continue des métriques de télémétrie

}

public async Task StopAsync()

{

// Arrêter la collecte de données

}

public bool isEnable()

{

// Vérifier si le module est activé

return ModuleInfo.isEnable;

}

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ماژول تله متری، مانند ماژول وب یا مدیریت، از این رابط برای پیاده سازی عملکردهای خود استفاده می کند.

استفاده از پلی مورفیسم

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

چند شکلی یک مفهوم برنامه نویسی است که به کلاس های مختلف اجازه می دهد تا به طور یکسان استفاده شوند. با استفاده از رابط IModule، PandApache3 می تواند همه ماژول ها را بدون توجه به نوع واقعی آنها به طور یکنواخت رفتار کند.

در کلاس سرور اصلی، ماژول ها مقداردهی اولیه می شوند و سپس در یک دیکشنری نوع ذخیره می شوند IModule :

public Dictionary<ModuleType, IModule> Modules = new Dictionary<ModuleType, IModule>();

// Initialisation des modules

TelemetryModule telemetryModule = new TelemetryModule(telemetryTaskScheduler);

ConnectionManagerModule webModule = new ConnectionManagerModule(ModuleType.Web, Pipelines[“web”], webTaskScheduler);

ConnectionManagerModule adminModule = new ConnectionManagerModule(ModuleType.Admin, Pipelines[“admin”], adminTaskScheduler);

Modules.Add(ModuleType.Telemetry, telemetryModule);

Modules.Add(ModuleType.Web, webModule);

Modules.Add(ModuleType.Admin, adminModule);

// Garder seulement les modules activés dans la configuration

foreach (var moduleKey in Modules.Keys.ToList())

{

if (!Modules[moduleKey].isEnable())

{

ExecutionContext.Current.Logger.LogWarning($”Module {moduleKey} désactivé”);

Modules.Remove(moduleKey);

}

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ماژول ها، اگرچه به عنوان اشیا ایجاد می شوند TelemetryModule یا ConnectionManagerModule، به شکل ذخیره می شوند IModule. بنابراین ما می توانیم آنها را به طور یکسان مدیریت کنیم، بدون اینکه نوع خاص آنها را بدانیم.

راه اندازی و اجرای ماژول ها

سرور از یک حلقه برای راه اندازی همه ماژول های فعال شده استفاده می کند، به لطف چند شکلی. این چیزی است که به نظر می رسد:

foreach (var moduleName in Modules.Keys)

{

await Modules[moduleName].StartAsync();

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

List<Task> tasks = new List<Task>();

foreach (var moduleName in Modules.Keys)

{

tasks.Add(Task.Run(() => Modules[moduleName].RunAsync()));

}

await Task.WhenAll(tasks);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و برای جلوگیری از آنها:

foreach (var moduleName in Modules.Keys)

{

await Modules[moduleName].StopAsync();

}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک ماژول جدید اضافه کنید

به لطف این معماری ماژولار، افزودن یک ماژول جدید به PandApache3 ساده است: فقط یک کلاس جدید بنویسید که پیاده سازی IModule. رابط چارچوبی را تحمیل می کند که یکپارچگی آسان و سازگار را تضمین می کند.

رابط ها نقشی حیاتی در سراسر PandApache3 دارند. به عنوان مثال، تمام میان افزارها از اینترفیس پیروی می کنند IMiddleware، که به آنها اجازه می دهد روی زنجیره اجرا شوند. مؤلفه‌هایی مانند سوکت، لاگر، مدیر فایل و حتی مدیر پیکربندی نیز از رابط‌ها استفاده می‌کنند که کد را انعطاف‌پذیرتر و آزمایش آن را آسان‌تر می‌کند.

با این رویکرد ماژولار و استفاده هوشمندانه از رابط ها، PandApache3 تبدیل به یک وب سرور قابل توسعه و نگهداری می شود که آماده تکامل با ویژگی های جدید بدون نیاز به تغییرات قابل توجه در پایه کد موجود است.

امیدوارم این مقاله به شما کمک کرده باشد که نقش مشخص و اساسی رابط ها در سی شارپ را بهتر درک کنید. اگر به این زبان علاقه دارید، بدانید که کد PandApache3 در GitHub در دسترس است و در Twitch به صورت زنده در دسترس است. در دنبال کردن ماجراجویی دریغ نکنید!

وب سرور PandApache3 مبتنی بر معماری ماژولار است. اما این در عمل به چه معناست؟


ماژول های یک وب سرور

اگر سرویس PandApache3 را به عنوان یک “جعبه سیاه” در نظر بگیریم، با این وجود می توانیم آن را به سه ماژول اصلی تقسیم کنیم:

  • وب ماژول : امکان پردازش درخواست های HTTP در پورت 80 را فراهم می کند و به سایتی که توسط PandApache3 میزبانی شده است دسترسی پیدا می کند.

  • مدیر ماژول : یک رابط وب برای مدیریت سرویس PandApache ارائه می دهد.

  • ماژول تله متری : برای جمع آوری و تجزیه و تحلیل داده ها در مورد عملکرد سرویس استفاده می شود.

این ماژول ها به صورت هم افزایی کار می کنند، اما می توانند به طور مستقل نیز اجرا شوند، که در طول توسعه بسیار راحت است. به عنوان مثال، شما می توانید فقط ماژول تله متری را برای آزمایش آن فعال کنید، بدون اینکه ماژول های دیگر مانع شما شوند. این انعطاف پذیری تست را ساده می کند و چرخه های توسعه را سرعت می بخشد.

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


ادغام آسان با رابط ها

برای استاندارد کردن رفتار هر ماژول، PandApache3 از یک رابط C# به نام استفاده می کند IModule. بیایید ببینیم یک رابط در عمل چه چیزی را به ارمغان می آورد.

الف رابط در سی شارپ قراردادی است که یک سری متدها را بدون پیاده سازی تعریف می کند. با تحمیل یک چارچوب مشترک، تضمین می کند که همه ماژول ها دارای عملکردهای اولیه یکسان هستند، در حالی که به هر ماژول اجازه می دهد تا رفتار خود را سفارشی کند.

رابط کاربری اینجاست IModule استفاده شده در PandApache3:


public interface IModule 

{ 

    Task StartAsync(); 

    Task RunAsync(); 

    Task StopAsync(); 

    bool isEnable(); 

} 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر ماژول باید قادر به شروع، اجرا و توقف باشد. روش isEnable() برای بررسی اینکه آیا ماژول مطابق با پیکربندی سرویس فعال شده است یا خیر استفاده می شود. با پیاده سازی این رابط، هر ماژول تضمین می کند که به این ساختار احترام می گذارد.

اجرای مثال برای ماژول تله متری:


public class TelemetryModule : IModule 

{ 

    public async Task StartAsync() 

    { 

        // Initialiser la collecte de données 

    } 



    public async Task RunAsync() 

    { 

        // Collecte en continue des métriques de télémétrie 

    } 



    public async Task StopAsync() 

    { 

        // Arrêter la collecte de données 

    } 



    public bool isEnable() 

    { 

        // Vérifier si le module est activé 

        return ModuleInfo.isEnable; 

    } 

} 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ماژول تله متری، مانند ماژول وب یا مدیریت، از این رابط برای پیاده سازی عملکردهای خود استفاده می کند.


استفاده از پلی مورفیسم

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

چند شکلی یک مفهوم برنامه نویسی است که به کلاس های مختلف اجازه می دهد تا به طور یکسان استفاده شوند. با استفاده از رابط IModule، PandApache3 می تواند همه ماژول ها را بدون توجه به نوع واقعی آنها به طور یکنواخت رفتار کند.

در کلاس سرور اصلی، ماژول ها مقداردهی اولیه می شوند و سپس در یک دیکشنری نوع ذخیره می شوند IModule :


public Dictionary<ModuleType, IModule> Modules = new Dictionary<ModuleType, IModule>(); 



// Initialisation des modules 

TelemetryModule telemetryModule = new TelemetryModule(telemetryTaskScheduler); 

ConnectionManagerModule webModule = new ConnectionManagerModule(ModuleType.Web, Pipelines["web"], webTaskScheduler); 

ConnectionManagerModule adminModule = new ConnectionManagerModule(ModuleType.Admin, Pipelines["admin"], adminTaskScheduler); 



Modules.Add(ModuleType.Telemetry, telemetryModule); 

Modules.Add(ModuleType.Web, webModule); 

Modules.Add(ModuleType.Admin, adminModule); 



// Garder seulement les modules activés dans la configuration 

foreach (var moduleKey in Modules.Keys.ToList()) 

{ 

    if (!Modules[moduleKey].isEnable()) 

    { 

        ExecutionContext.Current.Logger.LogWarning($"Module {moduleKey} désactivé"); 

        Modules.Remove(moduleKey); 

    } 

} 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ماژول ها، اگرچه به عنوان اشیا ایجاد می شوند TelemetryModule یا ConnectionManagerModule، به شکل ذخیره می شوند IModule. بنابراین ما می توانیم آنها را به طور یکسان مدیریت کنیم، بدون اینکه نوع خاص آنها را بدانیم.


راه اندازی و اجرای ماژول ها

سرور از یک حلقه برای راه اندازی همه ماژول های فعال شده استفاده می کند، به لطف چند شکلی. این چیزی است که به نظر می رسد:


foreach (var moduleName in Modules.Keys) 

{ 

    await Modules[moduleName].StartAsync(); 

} 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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


List<Task> tasks = new List<Task>(); 

foreach (var moduleName in Modules.Keys) 

{ 

    tasks.Add(Task.Run(() => Modules[moduleName].RunAsync())); 

} 



await Task.WhenAll(tasks); 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و برای جلوگیری از آنها:


foreach (var moduleName in Modules.Keys) 

{ 

    await Modules[moduleName].StopAsync(); 

} 

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


یک ماژول جدید اضافه کنید

به لطف این معماری ماژولار، افزودن یک ماژول جدید به PandApache3 ساده است: فقط یک کلاس جدید بنویسید که پیاده سازی IModule. رابط چارچوبی را تحمیل می کند که یکپارچگی آسان و سازگار را تضمین می کند.

رابط ها نقشی حیاتی در سراسر PandApache3 دارند. به عنوان مثال، تمام میان افزارها از اینترفیس پیروی می کنند IMiddleware، که به آنها اجازه می دهد روی زنجیره اجرا شوند. مؤلفه‌هایی مانند سوکت، لاگر، مدیر فایل و حتی مدیر پیکربندی نیز از رابط‌ها استفاده می‌کنند که کد را انعطاف‌پذیرتر و آزمایش آن را آسان‌تر می‌کند.

با این رویکرد ماژولار و استفاده هوشمندانه از رابط ها، PandApache3 تبدیل به یک وب سرور قابل توسعه و نگهداری می شود که آماده تکامل با ویژگی های جدید بدون نیاز به تغییرات قابل توجه در پایه کد موجود است.


امیدوارم این مقاله به شما کمک کرده باشد که نقش مشخص و اساسی رابط ها در سی شارپ را بهتر درک کنید. اگر به این زبان علاقه دارید، بدانید که کد PandApache3 در GitHub در دسترس است و در Twitch به صورت زنده در دسترس است. در دنبال کردن ماجراجویی دریغ نکنید!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا