ذخیره و خواندن تنطیمات پروژه در ASP.NET MVC
یکی از مواردی که در هر پروژه ای نیاز است داشتن تنظیمات نرم افزار می باشد . تنظیماتی مانند ذخیره اطلاعات مربوط به شرکت ، اطلاعات میل سرور جهت ارسال ایمیل ، تنظیمات عمومی سیستم مانند رنگ و اندازه قلم و …
در ادامه قصد داریم روشی را جهت پیاده سازی این مورد بیان کرده و همچنین اطلاعات موجود را از سیستم خوانده و در داخل پروزه از آن استفاده نماییم .
یکی از مواردی که شاید بتوان گفت زیاد استفاده می شود ، استفاده از یک جدول مجزا برای هر تنظیمات می باشد ، به طور مثال یک جدول برای اطلاعات شرکت ، یک جدول برای اطلاعات قالب سایت و …
قصد داریم فقط ار یک جدول که شامل دو فیلد کلید / مقدار می باشد برای پیاده سازی بخش تنظیمات استفاده کنیم .
ایتدا جدول Setting را همانند زیر طراحی میکنیم :
1 2 3 4 5 |
public class Setting { public string Key { get; set; } public string Value { get; set; } } |
کلید ها به صورت زیر ذخیره خواهند شد :
1 2 3 4 5 |
CompanyInfo.Tel CompanyInfo.Fax SocialNetwork.GooglePlusLink |
در ادامه نیاز درایم سرویسی را بنویسیم که کار درج و به دریافت اطلاعات موجود در جدول Setting را انجام دهد .
برای بخش بروزرسانی اطلاعات جدول Setting از قطعه کد زیر استفاده میکینم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public void Set<T>(T model) where T : ISetting { var prefix = typeof(T).Name; Type type = typeof(T); foreach (PropertyInfo prop in typeof(T).GetProperties()) { var key = $"{prefix}.{prop.Name}"; var setting = _settings.FirstOrDefault(row => row.Key == key); var isAddedd = true; if (setting == null) { setting = new Setting { Key = key }; _settings.Add(setting); _uow.MarkAsAdded(setting); isAddedd = false; } setting.Value = prop.GetValue(model, null)?.ToString() ?? string.Empty; if (isAddedd) _uow.MarkAsChanged(setting); _cache.AddOrUpdate(key, setting.Value, (oldkey, oldValue) => setting.Value); } } |
و همچنین برای دریافت اطلاعات از قطعه کد زیر استفاده میکنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public T Get<T>() where T : ISetting { object value; var setting = Activator.CreateInstance<T>(); var prefix = typeof(T).Name; foreach (PropertyInfo item in typeof(T).GetProperties()) { string key = $"{prefix}.{item.Name}"; _cache.TryGetValue(key, out value); if(value!=null) item.SetValue(setting, Convert.ChangeType(value,item.PropertyType) ); } return setting; } |
و همچنین برای دریافت فقط یک آیتم از جدول Setting از قطعه کد زیر استفاده میکنیم :
1 2 3 4 5 6 7 |
public string Get(string key) { object result; if (_cache.TryGetValue(key, out result)) return result.ToString(); return _settings.Find(key)?.Value??"NotFound"; } |
در ادامه ما نیاز خواهیم داشت به یکسری ViewModel که همگی آنها باید از Isetting ارث بری کرده باشند .
برای نمونه
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class CompanyInfo:Isetting { public string CompanyName {get;set;} public string PhoneNumber{get;set;} } public class GoogleMap:Isetting { public string Lang {get;set;} public string Lat {get;set;} } |
برای فراخوانی سرویس فوق و دریافت اطلاعات از سرور باید به صروت زیر عمل کنیم :
1 |
var data = _settingService.Get<AboutSetting>(); |
و برای بروزرسانی اطلاعات بخش مورد نظر :
1 |
_settingService.Set<AboutSetting>(aboutUsViewModel); |
کدهای فوق تمامی کار بروزرسانی و دریافت اطلاعات جدول Setting را انجام می دهد و نیاز به تکرار کدهای مختلف برای نوشتن بخش های مختلف نمی باشد .
حال نیاز داریم تا از اطلاعات ذخیره شده در سیستم استفاده نماییم . برای پیاده سازی این مورد میتوان از کلاس پیش فرض WebViewPage را تغییر داده و اطلاعات مورد نظر را از آنجا خواند ، برای انجام این کار ابتدا در پوشه View روت اصلی یک کلاس همانند زیر ایجاد کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class BaseViewPage<TModel> : WebViewPage<TModel> { private readonly ISettingService _settingService; public BaseViewPage() { _settingService = ApplicationObjectFactory.Container.GetInstance<ISettingService>(); } public override void Execute() { } public string CompanyName { get { return _settingService.Get<CompanyInformationSetting>("CompanyName"); } } public string CompanyPhoneNumber { get { return _settingService.Get<CompanyInformationSetting>("PhoneNumber"); } } public string CompanyEmail { get { return _settingService.Get<CompanyInformationSetting>("Email"); } } public string CompanyAddress { get { return _settingService.Get<CompanyInformationSetting>("Address"); } } } |
سپس به web.config رفته و تگ pages را تغییر دهید (بر اساس namespace کلاس ایجاد شده فوق) :
1 |
<pages pageBaseType="MvcApplication1.WebViews.BaseViewPage"> |
* . ممکن است مواردی در کدهای فوق برای شما نا آشنا باشد برای اطلاعات بیشتر در مورد آنها :
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.