Tworząc aplikację, na pewnym etapie jej rozwoju, podejmujemy decyzję o implementacji możliwości konfiguracji tegoż systemu. Sposobów, czy też miejsc trzymania ustawień jest kilka. Artykuł opisuje w jaki sposób można zarządzać tymi zasobami.
W VisualStudio tworzymy nowy projekt typu Class Library. Upewniamy się, że nasza klasa jest publiczna (public) oraz statyczna (static). Następnie tworzymy przykładowe ustawienia, wartości:
public static string Version { get { return System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly .GetExecutingAssembly().Location).FileVersion; } } public static string MyDate { get { return DateTime.Now.ToString("dddd, dd-MM-yyyyr."); } } public static string ProductName { get; private set; } public static string EmailRegex { get; private set; } public static int MinPasswordLength { get; private set; } public static string EmailFrom { get; private set; }
Z racji tego, iż nasza klasa jest statyczna, właściwości (property) również muszą być statyczne. Pierwsze dwa pozbawione są setera (set), ponieważ od razu zwracają wartość – nie trzeba im jej nadawać. Pozostałe ustawienia zapisane są w różnych miejscach. Nadać im wartość można tylko i wyłącznie w prywatnym (private), statycznym konstruktorze (constructor), który jest bez parametrów. Przykładowy konstruktor z różnymi metodami „wyciągnięcia” danych mógłby wyglądać następująco:
static ApplicationManager() { ProductName = System.Configuration.ConfigurationManager.AppSettings["ProductName"].ToString(); Configuration config = ConfigurationManager.OpenMachineConfiguration(); System.Net.Configuration.MailSettingsSectionGroup mailSettings = (System.Net.Configuration.MailSettingsSectionGroup)config.GetSectionGroup("system.net/mailSettings"); EmailFrom = mailSettings.Smtp.From; EmailRegex = new LibraryModel.LibraryEntities().Configuration.First().EmailRegex; SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["LibraryEntities"].ConnectionString); System.Data.SqlClient.SqlCommand sqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM Configuration WHERE Id = 1", sqlCon); System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(sqlCmd.CommandText, sqlCon); System.Data.DataTable dtConfig = new System.Data.DataTable(); try { sqlCon.Open(); da.Fill(dtConfig); } catch (Exception ex) { MinPasswordLength = 5; } finally { sqlCon.Close(); } if (dtConfig.Rows.Count > 0) MinPasswordLength = Convert.ToInt32(dtConfig.Rows[0]["MinPasswordLength"].ToString()); }
Aby wszystko działało poprawnie, należy dodać referencję do System.Configuration, co zapewni nam dostęp do ConfigurationManager.
W tym momencie możemy przetestować naszego zarządcę. Aby to uczynić tworzymy dwa projekty: Console Application oraz Web Application. Obu dajemy referencje do projektu z naszym managerem. Końcowy przykład wywołań zarządcy oraz ich rezultaty wyglądają następująco:
static void Main(string[] args) { Console.WriteLine(ApplicationManager.Version); Console.WriteLine(ApplicationManager.MyDate); Console.WriteLine(ApplicationManager.ProductName); Console.WriteLine(ApplicationManager.EmailFrom); Console.WriteLine(ApplicationManager.EmailRegex); Console.WriteLine(ApplicationManager.MinPasswordLength); }
const string BR = "<br />"; protected void Page_Load(object sender, EventArgs e) { Response.Write(string.Format("{1}{0}{2}{0}{3}{0}{4}{0}{5}{0}{6}", BR, ApplicationManager.Version, ApplicationManager.MyDate, ApplicationManager.ProductName, ApplicationManager.EmailFrom, ApplicationManager.EmailRegex, ApplicationManager.MinPasswordLength) ); }
W rezultacie otrzymujemy wersję naszego managera, datę systemową w naszym formacie, nazwę systemu zapisaną w konfiguracji aplikacji, adres 'from’ z ustawień komputera (machine.config), wyrażenie regularne do walidacji adresu email pobrane z bazy za pomocą modelu z Entity Framework, minimalną długość hasła pobraną z bazy za pomocą klasycznego ADO.NET.
Na sam koniec pragnę zwrócić uwagę, iż nazwa aplikacji zapisana w pliku konfiguracyjnym jest inna w obu przypadkach. Dzieje się tak, ponieważ obiekt ConfigurationManager pobiera plik konfiguracyjny tego z systemów, który wywołuje naszego zarządce.