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 :)