ذخیره و خواندن تنطیمات پروژه در ASP.NET MVC

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

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

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

قصد داریم فقط ار یک جدول که شامل دو فیلد کلید / مقدار می باشد برای پیاده سازی بخش تنظیمات استفاده کنیم .

ایتدا جدول Setting را همانند زیر طراحی میکنیم :

public  class Setting
{
    public string Key { get; set; }
    public string Value { get; set; }
}

کلید ها به صورت زیر ذخیره خواهند شد :

CompanyInfo.Tel

CompanyInfo.Fax

SocialNetwork.GooglePlusLink

در ادامه نیاز درایم سرویسی را بنویسیم که کار درج و به دریافت اطلاعات موجود در جدول Setting را انجام دهد . 

برای بخش بروزرسانی اطلاعات جدول Setting از قطعه کد زیر استفاده میکینم :

 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);
            }

        }

و همچنین برای دریافت اطلاعات از قطعه کد زیر استفاده میکنیم :

 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 از قطعه کد زیر استفاده میکنیم :

 public string Get(string key)
        {
            object result;
            if (_cache.TryGetValue(key, out result))
                return result.ToString();
            return _settings.Find(key)?.Value??"NotFound";
        }

در ادامه ما نیاز خواهیم داشت به یکسری ViewModel که همگی آنها باید از Isetting ارث بری کرده باشند .

برای نمونه

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;}

}

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

var data = _settingService.Get<AboutSetting>();

و برای بروزرسانی اطلاعات بخش مورد نظر :

_settingService.Set<AboutSetting>(aboutUsViewModel);

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

حال نیاز داریم تا از اطلاعات ذخیره شده در سیستم استفاده نماییم . برای پیاده سازی این مورد میتوان از کلاس پیش فرض WebViewPage را تغییر داده و اطلاعات مورد نظر را از آنجا خواند ، برای انجام این کار ابتدا در پوشه View روت اصلی یک کلاس همانند زیر ایجاد کنید :

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 کلاس ایجاد شده فوق) :

<pages pageBaseType="MvcApplication1.WebViews.BaseViewPage">

 

* . ممکن است مواردی در کدهای فوق برای شما نا آشنا باشد برای اطلاعات بیشتر در مورد آنها :

unitOfWork

structureMap


توسط : عثمان رحیمی  1 ماه قبل ، چهارشنبه 8 شهریور 1396 ساعت 11:58  0  99

نظر شما برای ما مهم است و به ما در بهبود سایت کمک میکند.


ارسال نظر
  • نام (اختیاری ) :
  • پست الکترونیک :
  • توضیحات :

مطالب مرتبط