Bonjour
Je cherche la maniere la plus elégante d'acceder au config a travers toute l'app
Puis-je le declarer static Public quelque part, dans le main par exemple ?
J'ai essayé mais sans succes
Je seche un peu là ! :oops:
Version imprimable
Bonjour
Je cherche la maniere la plus elégante d'acceder au config a travers toute l'app
Puis-je le declarer static Public quelque part, dans le main par exemple ?
J'ai essayé mais sans succes
Je seche un peu là ! :oops:
tu parles du fichier app.config ? il est déjà accessible de toute l'appli, avec la classe ConfigurationManager...
Salut Tomlev
Non je parlais de DefaultNameSpace.MapScopeNG.Properties.Settings
C'est ce que j'emploie mais le fait d'etre tributaire du DefaultNameSpace me derangeCode:
1
2 MapScopeNG.Properties.Settings Config = new MapScopeNG.Properties.Settings(); imPathDst = Config.PathImagesDst;
Je ne connais pas App.Config
Ou plutot je pensais y acceder avec le code ci-dessus !
J'ai utilisé maintenant
Mais je suis ouvert a toute les suggestion car c'est un peu la bouteille a encre cette gestion des configCode:
1
2
3 ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = "Divers.config"; Configuration Config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
D'ailleurs quand j'ai commencé avec .NET il y a qq mois j'ai commencé par me faire une petite classe du style gestion de .ini avec l'API windows car je trouvais cela beaucoup plus simple que les usines a gaz proposées pour les config qui ne me paraissent toujours pas vraiment claires !
je comprends pas trop ce qui pose problème... tu n'as pas besoin de créer une instance de Settings, il y en a une qui est déjà créée : MonNamespace.Properties.Settings.Default
(Default étant une propriété statique de la classe Settings, donc accessible de toute l'appli)
Bonsoir Tomlev
Ok, Admetons que
soit accessible, ca me permet de ne pas creer l'instance mais je n'y gagne pas grand chose :Code:MonNamespace.Properties.Settings.Default
Voici un exemple de probleme :
J'ai quelque classe dans un Folder "common" que je partage a travers differents projets !
Ce sont des outils génériques destinés a le rester mais en constante evolution (NON ! : ne me dis pas d'en faire une dll !); ;)
Le problème c'est que pour certains j'aimerais acceder a la config de l'application pour lire ou ecrire certains settings.
Donc il est exclu d'utiliser MonNamespace.Properties.Settings.Default qui n'est forcément pas généralisable a cause de l'acces par MonNamespace
La seule solution que j'ai trouvé pour le moment c'est soit l'ini soit le
Et je me demande si l'ini n'est pas en définitive plus simple et plus souple.Code:ConfigurationManager.OpenMappedExeConfiguration
Tu a raison et c'est pour ca que j'ai quand meme gardé le configurationmanager
Mais c'est quand meme dommage qu'on ne puisse pas acceder le
de maniere génériqueCode:MonNamespace.Properties.Settings.Default
Par exemple :
Code:Application.Properties.Settings.Default
Pour la dll, voici quelques (bonnes) raison
1- Comme c'est en constante évolution et que l'evolution est +/- dictée par le projet actif c'est tres confortable d'agir directement a partir du projet en développement. Bien entendu le scribe attentif veillera a la généralisation de ce qu'il modifie !!
2- Je trouve qu'il est tres agréable lors d'un install de pouvoir si possible se contenter d'UN exe sans devoir gerer un bataillon de DLL
J'admet qu'il peut y avoir de bonnes raisons de défendre la DLL mais il y en a certainement d'autre pour défendre la méthode je j'emploie et qui s'avere tres efficace !
Et crois moi, aucune regle de design n'a jamais transmuté un code foireux en modéle d'efficacité !
Pour la DLL, je plaisantais bien sûr, tu fais comme tu veux ;)
Récemment j'ai un peu creusé le système de settings de Visual Studio, et c'est un peu tordu... en fait, j'ai l'impression que le seul moyen simple d'accéder aux settings est de passer par la classe générée par le designer. Apparemment le système utilise les propriétés déclarées dans cette classe avec l'attribut UserScopedSettingAttribute ou ApplicationScopedSettingAttribute pour savoir quelles propriétés existent dans le .config : si la propriété n'existe pas dans la classe et qu'elle existe dans le fichier, pas moyen de la lire (du moins, pas simplement). Bref, ce système est pratique tant que tu l'utilises dans le cadre prévu, mais dès que tu en sors, c'est un peu la m***e...
Donc pour toi la façon la plus simple serait peut-être d'utiliser ton propre système de paramètres (je fais souvent ça en déclarant une classe "Config" que je sérialise en XML).
Mouis !
Je te suis la ! :roll:
Cela etant, la methode alternative moyennant un petit emballage est peut etre la solution aussi
Ca donne un truc comme ca
N.B. : je n'ai pas d'expérience en sérialisation XML serait-ce encore plus simple que ce que je fais ci-dessous ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 using System; using System.Windows.Forms; using System.Configuration; namespace BCPhoto { class ConfigPhoto { System.Configuration.Configuration Config; const string CST_SRC = "ImgPathSrc"; const string CST_DST = "ImgPathDst"; // ************************************************************************ public String ImgPathSrc { get { if (Config.AppSettings.Settings[CST_SRC] == null) { return ""; } return Config.AppSettings.Settings[CST_SRC].Value; } set { if (Config.AppSettings.Settings[CST_SRC] == null) { Config.AppSettings.Settings.Add(CST_SRC, value); Config.Save(); return; } Config.AppSettings.Settings[CST_SRC].Value = value; Config.Save(); } } // ************************************************************************ public String ImgPathDst { get { if (Config.AppSettings.Settings[CST_DST] == null) { return ""; } return Config.AppSettings.Settings[CST_DST].Value; } set { if (Config.AppSettings.Settings[CST_DST] == null) { Config.AppSettings.Settings.Add(CST_DST, value); Config.Save(); return; } Config.AppSettings.Settings[CST_DST].Value = value; Config.Save(); } } // ************************************************************************ public ConfigPhoto() { ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = @"Photo.config"; Config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); if (Config.AppSettings.Settings[CST_DST] == null) { MessageBox.Show("Warning no Photo path defined ! Please select one"); FolderBrowserDialog opf = new FolderBrowserDialog(); opf.ShowNewFolderButton = false; opf.ShowDialog(); Config.AppSettings.Settings.Add(CST_DST,opf.SelectedPath); Config.Save(); } } } }
Plus simple, je sais pas, mais c'est pas bien compliqué... en supposant que tu aies une classe Config avec des propriétés représentant tes paramètres, tu peux faire ça :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public static void SaveConfig(Config cfg, string filename) { XmlSerializer xs = new XmlSerializer(typeof(Config)); StreamWriter wr = new StreamWriter(filename); xs.Serialize(wr, cfg); wr.Close(); } public static Config LoadConfig(string filename) { XmlSerializer xs = new XmlSerializer(typeof(Config)); StreamReader rd = new StreamReader(filename); Config cfg = xs.Deserialize(rd) as Config; rd.Close(); return cfg; }