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 :)
3Dastronomyagricultureaudioautosautos.audiautos.audioautos.binariesautos.bmwautos.clubautos.fordautos.hondacrxautos.japanautos.mercedesautos.opelautos.sportautos.volvoautos.vwaviaavia.binariesbankcardsbinariesbooksbuildingcinemacommercecomp.hardwarecomp.softwarecomp.lietuvinimascomp.networksculturedarbas.ieskaudarbas.siulaudesigneconomicselectronicsfaunafauna.aquafauna.binariesfishingflorafotofoto.binariesgamesgames.csgames.onlinegsmgurmanaihumourhumour.binariesinternetlawmicrosoftmotomusicmusic.binariesmusic.instrumentsmusic.LT.binariesnavigacijaphppoliticsprogrammingrpgsportstudyingsveikatatalktesttranslationtransportationtraveltravel.binariestvunixvideovideo.binarieswatersportswwwwww.flashpdaautos.supermama.ltmobiledarbasretro.3Dretro.agricultureretro.astronomyretro.audioretro.autosretro.autos.audiretro.autos.audioretro.autos.binariesretro.autos.bmwretro.autos.clubretro.autos.fordretro.autos.hondacrxretro.autos.japanretro.autos.mercedesretro.autos.opelretro.autos.sportretro.autos.supermamaretro.autos.supermama.ltretro.autos.volvoretro.autos.vwretro.aviaretro.avia.binariesretro.bankcardsretro.beosretro.binariesretro.booksretro.buildingretro.cinemaretro.commerceretro.compretro.comp.hardwareretro.comp.lietuvinimasretro.comp.networksretro.comp.softwareretro.cultureretro.darbasretro.darbas.ieskauretro.darbas.siulauretro.designretro.economicsretro.electronicsretro.e-vejasretro.faunaretro.fauna.aquaretro.fauna.binariesretro.fishingretro.floraretro.fotoretro.foto.binariesretro.gamesretro.games.csretro.games.onlineretro.games.rpgretro.genealogijaretro.gsmretro.gurmanairetro.humourretro.humour.binariesretro.internetretro.YZFretro.YZF.nebukretro.YZF.nebuk.netikintisretro.YZF.nebuk.netikintis.bukretro.YZF.nebuk.netikintis.buk.tikintisretro.lawretro.microsoftretro.mobileretro.motoretro.musicretro.music.binariesretro.music.instrumentsretro.music.LTretro.music.LT.binariesretro.navigacijaretro.newsretro.news.taisyklesretro.newuserretro.pdaretro.phpretro.politicsretro.programmingretro.rpgretro.sportretro.studyingretro.sveikataretro.talkretro.translationretro.transportationretro.travelretro.travel.binariesretro.tvretro.unixretro.videoretro.video.binariesretro.watersportsretro.wwwretro.www.flashdiylt.rkm.news.announcelt.rkm.news.newuser