کلاسهای Singleton در مقابل استاتیک در C #
[ad_1]
هنگام توسعه برنامه ها در NET Core ، ممکن است اغلب به یک نمونه مشترک از یک کلاس نیاز داشته باشید. موارد معمول استفاده از LogManager ، StateManager و موارد دیگر است. برای انجام این کار می توانید از یک کلاس منفرد یا یک کلاس استاتیک استفاده کنید. تصمیم گیری برای انتخاب – منفرد یا ساکن – به عوامل مختلفی بستگی دارد. در این مقاله کلاسهای منفرد و کلاسهای ساکن و زمان استفاده از آنها در برابر یکدیگر توضیح داده شده است.
برای کار با مثالهای کد ارائه شده در این مقاله ، باید Visual Studio 2019 را روی سیستم خود نصب کنید. اگر هنوز کپی ندارید ، می توانید Visual Studio 2019 را از اینجا بارگیری کنید. تو می توانی NET 5.0 را از اینجا بارگیری کنید.
یک پروژه ASP.NET Core 5 MVC در Visual Studio 2019 ایجاد کنید
ابتدا بیایید یک پروژه ASP.NET Core در Visual Studio 2019 ایجاد کنیم. پس از این مراحل ، شما باید یک پروژه جدید ASP.NET 5 در Visual Studio 2019 ایجاد کنید.
- Visual Studio IDE را اجرا کنید.
- روی “ایجاد یک پروژه جدید” کلیک کنید.
- در پنجره “ایجاد پروژه جدید” ، “ASP.NET Core Web App (Model-View-Controller)” را از لیست الگوهای نمایش داده شده انتخاب کنید.
- روی Next کلیک کنید.
- در پنجره “پیکربندی پروژه جدید خود” ، نام و موقعیت پروژه جدید را مشخص کنید.
- به دلخواه ، بسته به تنظیمات برگزیده ، کادر تأیید “محل قرار دادن راه حل و پروژه در همان دایرکتوری” را انتخاب کنید.
- روی Next کلیک کنید.
- در پنجره “اطلاعات بیشتر” که در زیر نشان داده شده است .NET 5.0 را به عنوان قاب هدف از لیست کشویی در بالا انتخاب کنید.
- اطمینان حاصل کنید که کادرهای تأیید “Enable Docker” ، “Configure for HTTPS” و “Enable Razor runtime compilation” علامت گذاری شده اند ، زیرا در اینجا از هیچ یک از این ویژگی ها استفاده نخواهیم کرد.
- اطمینان حاصل کنید که تأیید اعتبار روی “هیچکدام” تنظیم شده است ، زیرا ما از تأیید اعتبار استفاده نخواهیم کرد.
- روی ایجاد کلیک کنید.
کلاس تک یا کلاس ایستا؟ نحوه انتخاب
ما یک کلاس واحد و یک کلاس ثابت را بر اساس نکات زیر مقایسه و مقایسه خواهیم کرد:
- تزریق اعتیاد
- مدیریت حافظه
- قابلیت انبساط
- قابل آزمایش بودن
در بخش های بعدی ، ما دو کلاس را پیاده سازی خواهیم کرد – یک کلاس ثابت به نام StaticLogger و یک کلاس واحد به نام SingletonLogger. هر دو کلاس یک روش ورود به سیستم را ارائه می دهند که می تواند برای ثبت داده ها در یک هدف ورود به سیستم خاص استفاده شود. در هر دو مثال زیر ، من کد لازم را برای ثبت داده های اختصار حذف کرده ام. (می توانید اطلاعات بیشتری درباره کلاسهای استاتیک و اعضای کلاس استاتیک در C # در مقاله قبلی من در اینجا بخوانید.)
ایجاد یک کلاس استاتیک لاگر در C #
کلاسهای ساکن را نمی توان ایجاد یا گسترش داد. آنها انتزاعی هستند و به طور ضمنی مهر و موم شده اند. برای اعلام یک کلاس به عنوان ساکن ، باید آن را با کلمه کلیدی استاتیک در اعلامیه کلاس علامت گذاری کنید. کلمه کلیدی استاتیک به شما امکان می دهد هم کلاسهای ساکن و هم اعضای ثابت را تعریف کنید.
قطعه کد زیر یک کلاس استاتیک را نشان می دهد.
public static class StaticLogger
{
private static readonly object lockObj = new object();
public static void Log(string message)
{
//Write code here to log data.
}
}
به طور معمول ، کلاسهای ساکن برای پیاده سازی کلاسهای کمکی یا کمکی استفاده می شوند. آنها معمولاً مجموعه ای از برخی روشها و خواص قابل استفاده مجدد را شامل می شوند.
ایجاد یک کلاس ثبت یک بار در C #
یک کلاس منفرد ، یک اجرای مدل طراحی واحد ، کلاسی است که فقط یک نمونه از آن می تواند وجود داشته باشد.
لیست کد زیر عملکرد حداقلی کلاس Singleton را نشان می دهد. از ویژگی استاتیک Instance می توان برای فراخوانی اعضای یک کلاس Singleton استفاده کرد.
public sealed class SingletonLogger
{
private static SingletonLogger instance;
private static object lockObj = new Object();
private SingletonLogger () { }
public static SingletonLogger Instance
{
get
{
lock (lockObj)
{
if (instance == null)
instance = new SingletonLogger();
}
return instance;
}
}
public void Log(string message)
{
//Write code here to log data.
}
}
Singleton در مقابل کلاسهای استاتیک و تزریق وابستگی
ASP.NET Core 5 MVC دارای پشتیبانی داخلی برای وابستگی به تزریق است. هنگام اجرای ASP.NET Core MVC ، می توانید سرویس هایی را به روش ConfigureServices از کلاس Startup به ظرف اضافه کنید. سپس این خدمات با استفاده از تزریق وابستگی به سایر طبقات در برنامه ارائه می شود. سپس می توانید از تزریق وابستگی به کنترل کننده یا کلاسهای دیگر استفاده کنید تا از نمونه های تزریق شده استفاده کنید.
با فرض اینکه شما یک کلاس غیر ساکن به نام FileLogger دارید که رابطی به نام ILogger را پیاده سازی می کند ، می توانید از قطعه کد زیر برای افزودن سرویس به محفظه یکبار مصرف استفاده کنید.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSingleton();
}
برای اجرای الگوی Singleton نیازی به نوشتن هیچ کدی نیستید – زمان اجرای ASP.NET Core 5 MVC از آن مراقبت می کند.
در مقابل ، اگر بخواهید یک کلاس استاتیک را به همان روشی که نمونه ای از یک کلاس غیر استاتیک را در مثال قبلی تزریق کرده اید ، تزریق کنید ، با خطا مواجه خواهید شد. این عمدتا به این دلیل است که کلاسهای استاتیک هیچ نمونه ای ندارند و بنابراین نمی توانند به عنوان آرگومان های نوع استفاده شوند.
قطعه کد زیر این را نشان می دهد.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddSingleton();
}
هنگام تدوین برنامه خطای زیر ظاهر می شود.
static types cannot be used as type arguments
شما می توانید از تزریق وابستگی در یک کلاس استاتیک با استفاده از روش تزریق یا خاصیت استفاده کنید. با این حال ، شما نمی توانید از تزریق سازنده کلاس استاتیک استفاده کنید زیرا سازنده کلاس استاتیک نمی تواند هیچ پارامتری را بپذیرد.
Singleton در مقابل کلاسهای استاتیک و مدیریت حافظه
اشیا St ساکن و کلاسهای ساکن در ناحیه ای از پشته مدیریت شده معروف به پشته با فرکانس بالا ذخیره می شوند. اشیا stored ذخیره شده در پشته با فرکانس بالا فقط هنگام بارگیری برنامه آزاد می شوند. نمونه واحد از یک کلاس منفرد است و بنابراین نمونه ای از یک کلاس واحد در پشته فرکانس بالا ذخیره می شود. به این ترتیب ، هنگام تخلیه یا خاتمه برنامه ، حافظه اشغال شده توسط نمونه ای از کلاس singleton آزاد می شود.
با این حال ، برخلاف یک کلاس استاتیک ، که فقط می تواند اشیا stat ساکن داشته باشد ، یک کلاس واحد می تواند دارای اشیا stat ایستا و غیر ایستا باشد. بنابراین ، از منظر مدیریت حافظه ، می توانید هنگام استفاده از یک کلاس واحد ، از جمع آوری زباله برای اشیا managed مدیریت شده استفاده کنید.
Singleton در مقابل کلاسهای استاتیک و قابلیت توسعه
یک کلاس کلاس معمولاً شامل یک سازنده خصوصی است و به عنوان مهر و موم شده علامت گذاری می شود تا نشان دهد که دیگر نمی تواند ایجاد شود و نه بیشتر به ارث برسد. بنابراین ، فقط در صورتی که یک سازنده غیر خصوصی در کلاس واحد داشته باشید ، می توانید یک کلاس واحد را گسترش دهید ، همانطور که در قطعه کد زیر نشان داده شده است.
public class SingletonLogger
{
protected SingletonLogger() { }
//Other members
}
اکنون می توانید کلاس Singleton را مطابق شکل زیر گسترش دهید.
public class LogManager : SingletonLogger
{
//Write your implementation here
}
به همین ترتیب ، شما نمی توانید یک کلاس استاتیک به ارث برده و متدهای آن را جایگزین کنید. همچنین ، اگرچه می توانید روشهای پسوند را در یک کلاس داشته باشید ، یک کلاس استاتیک نمی تواند روشهای پسوند داشته باشد.
Singleton در مقابل کلاسهای استاتیک و انعطاف پذیری
اگرچه می توانید نمونه ای از یک کلاس را شبیه سازی کنید ، اما در کلاس ایستا امکان پذیر نیست. شما می توانید روش Dispose را در یک کلاس واحد داشته باشید ، اما در یک کلاس ثابت نیست. شما نمی توانید نمونه ای از یک کلاس ثابت ایجاد کنید ، بنابراین نمی توان از آن در مواردی که مرجع “این” (نمایه کننده ، پارامتر روش) مورد نیاز است استفاده کرد. هر یک از اعضای یک کلاس استاتیک مانند سازنده ، فیلد ، خاصیت یا رویداد ساکن است. هر بار که از یک کلاس استاتیک استفاده می کنید ، هیچ کنترلی بر زمان فراخوانی سازنده استاتیک ندارید.
کلاسهای منفرد را می توان برای تنبلی بارگذاری کرد ، در حالی که کلاسهای ساکن را فقط می توان با بی حوصلگی بارگذاری کرد. شروع تنبل تکنیکی است که ایجاد یک شی را به تأخیر می اندازد ، یعنی. برای بهبود عملکرد برنامه و کاهش نیاز به حافظه ، نمونه ای از یک کلاس را می توان در صورت تقاضا بارگذاری کرد.
کلاسهای استاتیک و آزمون Singleton
در حالی که آزمایش یک کلاس منفرد آسان است ، اما برای یک کلاس ثابت نمی توان همین حرف را زد. مسخره کردن یک کلاس ساکن بسیار دشوار است (اگر غیرممکن نباشد). آزمایش های انجام شده روی یک کلاس استاتیک می توانند روی یکدیگر تأثیر بگذارند زیرا در موارد مختلف اجرا نمی شوند.
توجه داشته باشید که روشهای ساکن مربوط به یک کلاس استاتیک ذاتاً قابل آزمایش نیستند. یک روش ایستا که حاوی حالت نباشد یا وضعیت را تغییر ندهد ، می تواند به صورت جداگانه آزمایش شود. در حالی که روش و وابستگی های آن بیکار است ، این روش را می توان به صورت جداگانه آزمایش کرد. مشکلات وقتی بوجود می آیند که روش استاتیک روشهای دیگر را فراخوانی می کند یا وقتی که شی آزمایش روش ایستا را فرا می خواند.
به طور خلاصه ، یک کلاس ثابت است که نمی تواند نمونه داشته باشد و فقط شامل اعضای ثابت است ، یعنی. مقالاتی که مربوط به یک نمونه خاص نیستند. کلاس استاتیک واحد سازمانی برای مجموعه ای از روش ها است که با یک نمونه خاص مرتبط نیستند.
کلاس استاتیک وقتی فقط به کلاس کمکی نیاز دارید که چندین روش مفید داشته باشد ، انتخاب خوبی است – در چنین مواردی نیازی به نمونه ندارید. این منجر به یک اجرای ساده می شود و عملکرد برنامه را بهبود می بخشد ، زیرا نمونه هایی برای چنین کلاسی ندارید.
از مدل واحد می توان برای طراحی کلاسهایی استفاده کرد که فقط به یک نمونه در آن نیاز دارید. نمونه های معمول شامل کلاس های مدیریت برای استفاده در ورود به سیستم ، ذخیره سازی ، اتصال نخ و موارد دیگر است. وقتی می خواهید یک منبع مشترک را به عنوان چاپگر چاپگر مدیریت کنید ، یک کلاس واحد نیز انتخاب خوبی خواهد بود. برای این منظور باید یک نمونه داشته باشید تا از درخواست های متناقض برای همان منبع جلوگیری کنید.
نحوه انجام کارهای بیشتر در C #:
حق چاپ © 2021 ارتباطات IDG ، شرکت
[ad_2]