قطعا شرایطی پیش خواهد آمد که شما مجبور شوید دادههایی را به عنوان تنظیمات برنامه در محلی ذخیره کنید و مجددا آنها را فراخوانی کنید. روشهای مختلفی برای این کار وجود دارند که معروفترین و سادهترین راه، استفاده از Settings خود پروژه میباشد. اما این به منزله بهترین راه نیست! در این مطلب قصد داریم تنظیمات برنامه را در یک فایل json، با همان ساختار استانداردش ذخیره و بازیابی کنیم.
حالا برای دسترسی به این کلاس، یک متغیر جنریک را به نام Config ایجاد میکنیم:
همینطور برای خواندن یک فایل جیسون از محلی مشخص، یک متغیر دیگر را به نام filename ایجاد میکنیم:
در این کلاس به 2 متد نیاز داریم. متد اول برای دیسریالایز کردن فایل جیسون و متد دوم برای سریالایز کردن اطلاعات:
بصورت پیشفرض محل خواندن فایل جیسون را در کنار فایل اجرایی exe و با نام AppConfig.json در نظر میگیریم. در صورتی که فایل ما موجود بود، به کمک ReadAllText محتوای فایل جیسون را میخوانیم و در صورتی که خالی نبود، اقدام به دیسریالایز کردن آن میکنیم.
پراپرتی Config را که شامل اطلاعات ما میباشد، در محل موردنظر سریالایز میکنیم.
حالا پراپرتیهای دلخواه خود را ایجاد میکنیم:
دقت کنید که قبل از خواندن تنظیمات، باید ابتدا فایل تنظیمات را دیسریالایز کرده باشید. پس هنگام اجرای پروژه، متد Init را فراخوانی کنید:
و برای ذخیره کردن :
برای اینکار نیاز به سریالایز و دیسریالایز کردن مدل داریم. اگر از دات نت کور استفاده میکنید، کتابخانه توکار جیسون، در فضای نام System.Text.Json از عهده این کار بر میاد و اگر از نسخههای دات نت فریمورک استفاده میکنید، باید پکیج newtonsoft.json را نصب کنید.
برای شروع یک کلاس را به نام GlobalData (یا هر نام دلخواه دیگری) ایجاد کنید.
چون قرار هست این کلاس هر نوع مدلی را برای ما سریالایز و دیسریالایز کند، پس کلاس را بصورت جنریک تعریف کنید.
public abstract class GlobalData<T> where T : GlobalData<T>, new()
public static T Config { get; set; }
private static string _filename { get; set; }
public static void Init(string FileName = "AppConfig.json") { _filename = FileName; if (File.Exists(FileName)) { string json = File.ReadAllText(FileName); Config = (string.IsNullOrEmpty(json) ? new T() : JsonSerializer.Deserialize<T>(json)) ?? new T(); } else { Config = new T(); } }
در متد Save نیز:
public static void Save() { JsonSerializerOptions options = new JsonSerializerOptions { WriteIndented = true, IgnoreNullValues = true }; string json = JsonSerializer.Serialize(Config, options); File.WriteAllText(_filename, json); }
حالا به سراغ پروژهی دمو میرویم. یک کلاس را ایجاد کرده و از کلاس GlobalData ارث بری میکنیم:
internal class AppConfig : GlobalData<AppConfig>
public string ServerUrl { get; set; } = "https://sub.deltaleech.com"; public bool IsShowNotification { get; set; } = true; public NavigationViewPaneDisplayMode PaneDisplayMode { get; set; } = NavigationViewPaneDisplayMode.Left; public SkinType Skin { get; set; } = SkinType.Default;
protected override void OnStartup(StartupEventArgs e) { GlobalData<AppConfig>.Init(); }
برای خواندن تنظیمات به این صورت عمل کنید:
var skin = GlobalData<AppConfig>.Config.Skin;
GlobalData<AppConfig>.Config.Skin = Skin.Dark; GlobalData<AppConfig>.Save();
دقت داشته باشید که اگر بعد از ذخیره کردن تنظیمات، قصد داشته باشید اطلاعات جدید را دریافت کنید، باید حتما قبل از دریافت اطلاعات، متد Init را یکبار دیگر فراخوانی کنید تا اطلاعات جدید، نمایش داده شود.
نظرات مطالب
مفهوم READ_COMMITTED_SNAPSHOT در EF 6
خبری در اینباره از تیم SQL Server بعدی
اطلاعات بیشتر
The Hekaton team also found that multi-version concurrency control (MVCC) proved robust in scenarios with higher workloads and higher contention
یک خبر خوب:
در EF 6 نسخه بتا، متدی اضافه شده به نام AddRange که افزودن تعداد زیادی رکورد رو سهولت بخشیده
INSERTing many rows with Entity Framework 6 beta 1 and SQL Server Compact
در EF 6 نسخه بتا، متدی اضافه شده به نام AddRange که افزودن تعداد زیادی رکورد رو سهولت بخشیده
INSERTing many rows with Entity Framework 6 beta 1 and SQL Server Compact
نظرات مطالب
EF Code First #7
سلام؛
در SQL SERVER قسمتی داریم به نام INSERT And UPDATE Specification که دو گزینهی Delete Rule و Update Rule برای ارتباطها وجود دارند.
در اینجا شما WillCascadeOnDelete رو بیان کردید ولی من هر چه دنبال متدی متناظر با Update Rule میگردم وجود نداره.
یه چیزی مثل : WillCascadeOnUpdate
آیا در EF ساپورت نمیشه؟
- Drag و Drop کردن در الگوی MVVM | محمد صاحب | www.dotnetdev.info
- اضافه کردن Copy to / Move to به منوی کلیک راست در ویندوز ویستا و ۷ | خدادادی طاقانکی | nodiran.com
- آموزش سی شارپ – قسمت اول | mr.khaliliazar | narbonsoft.com
- شبکه اجتماعی شیرپوینت 2010 ( قسمت اول) | تکتم قربانی | www.parnianportal.com
- نکته : کلمه it در عبارات جستجو حین استفاده از Entity Framework | mojtabasahraei | mojtabasahraei.blogfa.com
- Announcing The jQuery Standards Team | Addy Osmani | blog.jquery.com
- iText.NET - C# Examples | www.ujihara.jp
- VisualSVN Server 2.5.1 Released | www.visualsvn.com
- SubtitleTools 1.9 منتشر شد | subtitletools.codeplex.com
- Visual Studio 2010 SP1 به لیست آپدیتهای اختیاری ویندوز اضافه شد | blogs.msdn.com
- Visual Studio add-in for SQL Server Compact 3.5 and 4.0 | sqlcetoolbox.codeplex.com
- آمار فروش کتاب iText | lowagie.com
- آیا Delphi XE2 برای استفاده در محیط کاری آماده است؟ | www.itwriting.com
- خالق زبان Lisp درگذشت | rss.slashdot.org
- لیست امتحانات مرتبط با SQL Server 2012 | beyondrelational.com
- در این مثال در حالت پیشفرض READ COMMITTED isolation level تراکنش، هرچند وجود UPDLOCK ضروری است، اما کافی نیست و باید به همراه HOLDLOCK هم باشد، تا اثر آن تا پایان تراکنش باقی بماند تا هم select و هم update، در حالتهای پردازش موازی، هر دو تحت کنترل قرار گیرند.
- روش اضافه کردن خودکار این hintها به تمام کوئریهای EF، با استفاده از Interceptorها، بدون نیاز به SQL نویسی مستقیم و عدم استفاده از LINQ: « بهبود عملکرد SQL Server Locks در سیستمهای با تعداد تراکنش بالا در Entity Framework »