Tema: Re: .net ir application settings'ai
Autorius: Jornada Del Muerto
Data: 2011-01-04 17:04:35
Su registrais visai nebloga ideja, jei kas turi laiko tai galiu papaskot kaip pats darau:

    1. Yra tiesiog RegistryAccess klasyte kuriai nurodoma nebent kuriuos registrus naudot HKLM ar HKCU, visa kita jin automatu dirba su Software/[brand|company name konstanta]/Application.ProductName, paemima darydama keliais generic types metodais:

  public T Get<T>(string name, T defaultValue);
  public T Get<T>(string name);
  public void Set(string name, object value);

    Zodziu ji abstraktizuoja ir supaprastina darba su registrais kad priklausomai kaip vadinsis Application assembly tokiu name ir susikurs registruose brendo folderyje folderi.

    2. Tada de/serializuojama Settings  klase, skirta butent app settingu realizavimui, norint app turet settingus ji tiesiog nuveldima ir pridedama visko ko i ja reikia, ji naudoja 1 punkte mineta klase, jin automatu ProductName folderyje susikuria ir dirba su Settings entry i tenai serializuodama ir deserializuodama visus settingus:

  public static void Save<T> (T obj);
  public static T Load<T> ();

    3. Sumoje viskas galutiniam kode supaprasteja ant tiek, kad i nuveldima Settings klase galima prideti kokiu nori ir kada nori nustatymu, imu kaip pavizdy cia releasinto Dupe Scanner tokius settingus:

 public class DupeScannerSettings : Alpha.Shell.Settings
 {
  bool _FirstProcessDirs = false;
  DupeScanSorting _Sorting = DupeScanSorting.ByName;
  string _LastPath;

  [TypeConverter(typeof(Alpha.Metadata.TypeConverters.EnumDescConverter))]
  [DisplayName ("Sort before compare"), Category ("Processing"), Description ("Sorting before same size files compare - in result if dupes found diferent file can be selected to leave on disk.")]
  public DupeScanSorting Sorting
  {
   get { return _Sorting; }
   set { _Sorting = value; }
  }

  [DisplayName("First process directories"),Category("Processing"), Description("On folder tree scan, first to process directories, elsewhere current directory files.")]
  public bool FirstProcessDirs
  {
   get { return _FirstProcessDirs; }
   set { _FirstProcessDirs = value; }
  }

  [Browsable(false)]
  public string LastPath
  {
   get { return _LastPath; }
   set { _LastPath = value; }
  }
 }

Tuo paciu aprasai leidzia is karto duoti useriui juos keisti PropertyGrid'e tik tada negalima nurodinet ComponentMode.DefaultValue - tai kazkodel pykstasi su serializacija.

4. O ju pakrovimas ir issaugojimas buna tik tiek kodo:

public class blabla {

    internal static DupeScannerSettings _Settings;


  public FrmMain ()
  {
   InitializeComponent ();

    // programos starto metu pakraunama
   _Settings = DupeScannerSettings.Load<DupeScannerSettings> ();

    }

  private void FrmMain_FormClosing (object sender, FormClosingEventArgs e)
  {
    // po to issaugojama
   DupeScannerSettings.Save (_Settings);
  }

Kadangi naudojasi generic types tai bazine klase gali serializuoti veliau nuveldeta objekta, ir viskas grazu, neuzima daug kodo ten kur biznio logika ir paprasta ;)


5. Kalbant apie kitu DLL settingus, tai galima laisvai cia patobulint kad eitu juos irgi ideti, kadangi i registrus rasosi XML tai mum nereikia nauju registry entry kurti pridedant nauja nustatyma ir galima patogiai plest + kazkam paredaguoti yra juos keblu nes serializuota UTF16 ir greit susipjaus perkelus i notepada :)