конденсировать код настроек модуля c # dnn - PullRequest
2 голосов
/ 08 января 2012

Это кодовый блок, который я использую в большинстве своих модулей DNN Settings, но он кажется слишком многословным для того, что он делает. Как бы вы сократили это, чтобы сделать его более полезным или хотя бы менее избыточным?

    /// -----------------------------------------------------------------------------
    /// <summary>
    /// LoadSettings loads the settings from the Database and displays them
    /// </summary>
    /// -----------------------------------------------------------------------------
    public override void LoadSettings()
    {
        try
        {
            if (Page.IsPostBack == false)
            {
                ddlTreeTabId.DataSource = GetTabs();
                ddlTreeTabId.DataBind();
                if (!string.IsNullOrEmpty((string)TabModuleSettings["TreeTabID"]))
                {   //Look for the tree tab id
                    this.ddlTreeTabId.SelectedValue = (string)TabModuleSettings["TreeTabID"];
                    //If we're here, we have a tab module id, now we can grab the modules on that page
                    LoadTabModules(ddlTreeModuleID, int.Parse((string)TabModuleSettings["TreeTabID"]));

                    //we only do this part if the proceeding steps checked out
                    //if we have a tree module id 
                    if (!string.IsNullOrEmpty((string)TabModuleSettings["TreeModuleID"]))
                    {
                        try
                        {
                            //carefully try to select that item from the module id drop down list
                            this.ddlTreeModuleID.SelectedValue = (string)TabModuleSettings["TreeModuleID"];
                        }
                        catch (Exception ex)
                        { //There may have been a module id but it aint on that page any more.  Ignore the error.
                            // I hate invoking try just to ignore an error. seems wasteful.
                        }
                    }
                }
        }
        catch (Exception exc) //Module failed to load
        {
            Exceptions.ProcessModuleLoadException(this, exc);
        }
    }

Мое идеальное решение - реализовать свойства таким образом, чтобы по всему модулю можно было возвращать идентификатор модуля дерева без ввода всего этого.

if (!string.IsNullOrEmpty((string)Settings["TreeTabID"]) &&
    !string.IsNullOrEmpty((string)Settings["TreeModuleID"]))
{
    Do_SomethingWithTheIDs(
        int.Parse((string)Settings["TreeTabID"]), 
        int.Parse((string)Settings["TreeModuleID"]));
}

Представьте себе сложность загрузки нескольких таких модулей. Тьфу.


UPDATE

Благодаря Оливье я написал новый класс для управления свойствами

public class TreeSettingsBase : ModuleSettingsBase
{
    public int? TreeTabID
    {
        get
        {
            string s = (string)Settings["TreeTabID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }

    public int? TreeModuleID
    {
        get
        {
            string s = (string)Settings["TreeModuleID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }

    public int? PersonTabID
    {
        get
        {
            string s = (string)Settings["PersonTabID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }

    public int? PersonModuleID
    {
        get
        {
            string s = (string)Settings["PersonModuleID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
    }
}

Так что теперь мои LoadSettings выглядят так:

public override void LoadSettings()
    {
        try
        {
            if (Page.IsPostBack == false)
            {
                ddlTreeTabId.DataSource = GetTabs();
                ddlTreeTabId.DataBind();               
                if (TreeTabID.HasValue)
                {   
                    this.ddlTreeTabId.SelectedValue = TreeTabID.ToString();
                    LoadTabModules(ddlTreeModuleID, TreeTabID.Value);
                    if (TreeModuleID.HasValue)
                    {
                        try
                        {
                            this.ddlTreeModuleID.SelectedValue = TreeModuleID.ToString();
                        }
                        catch (Exception ex)
                        { 
                        }
                    }
                }
                ddlPersonTabId.DataSource = GetTabs();
                ddlPersonTabId.DataBind();
                if (PersonTabID.HasValue)
                {
                    this.ddlPersonTabId.SelectedValue = PersonTabID.ToString();
                    LoadTabModules(ddlPersonModuleID, PersonTabID.Value);
                    if (PersonModuleID.HasValue)
                    {
                        try
                        {
                            this.ddlPersonModuleID.SelectedValue = PersonModuleID.ToString();
                        }
                        catch (Exception ex)
                        {
                        }
                    }
                }

            }
        }
        catch (Exception exc) //Module failed to load
        {
            Exceptions.ProcessModuleLoadException(this, exc);
        }
    }

ModuleSettingsBase доступен везде, так что TreeTabID, TreeModuleID, PersonTabID и PersonModuleID также будут. Это то, что я хотел, и он использует меньше кода, так что спасибо Оливье!

Было бы неплохо отказаться от try catch , но нет никакой гарантии, что значение будет в раскрывающемся списке, иначе оно будет еще меньше. Тем не менее, лучше.

1 Ответ

2 голосов
/ 08 января 2012

Создайте класс-оболочку для ваших настроек.

public class TabModuleSettingsWrapper {

   private SettingsCollection _settings; // I do not know of which type your settings are.

   public TabModuleSettingsWrapper(SettingsCollection settings) {
       _settings = settings;
   }

   public int? TreeModuleID { 
        get { 
            string s = (string)_settings["TreeModuleID"];
            int id;
            return Int32.TryParse(s, out id) ? id : (int?)null;
        }
   }

   // Repeat this for all the settings
}

Теперь вы можете получить доступ к настройкам с помощью:

var settings = new TabModuleSettingsWrapper(TabModuleSettings);
if (settings.TreeTabID.HasValue &&  settings.TreeModuleID.HasValue) {
    Do_SomethingWithTheIDs(settings.TreeTabID, settings.TreeModuleID);
}  
...