Quelle est la meilleure façon de mettre en œuvre une constante globale en C#?
J'ai un projet Commun à l'intérieur de laquelle j'ai ajouté ma constantes publiques pour QueryStringNames.
Je sais que généralement les constantes doivent être interne ou privé, mais j'avais besoin de constantes publiques ici, comme je tiens à permettre un accès global à la chaîne de requête noms, les clés de session, etc.
Il y a 3 solutions que je connais, mais tous ont un thème important. L'appelant assemblée contenir la copie de ma constante ce qui signifie que si je dois changer une valeur constante, je vais avoir à compiler mes assemblée Commune, et l'appelant assemblée!
1) public const string ConstName = "a value";
2) public readonly string ConstName = "a value";
3) To be stored in a public resource file.
Quelle serait la meilleure approche pour définir des constantes publiques en C# en dehors de les ranger dans le web.fichier de configuration (qui n'ont pas intellisense)?
Je suis un peu confus. Quel est l'emplacement de stockage de la valeur (c'est à dire webconfig) ont à voir avec la accesability d'une copie de cette valeur en mémoire?
vous avez raison @asawyer; ce qui n'aurait pas résoudre le problème si le nouveau const et readonly sont utilisés.
Je pense que l'OP s point était qu'il ne voulait pas avoir à recompiler toutes les assemblées si elle était dans une config?
OriginalL'auteur The Light | 2011-12-09
Vous devez vous connecter pour publier un commentaire.
Si vous pense que vous auriez du être en train de changer, et vous êtes inquiet d'avoir à compiler, alors pourquoi ne pas utiliser appSettings dans le fichier de configuration web? Qu'est ce que c'est. Si vous avez vraiment besoin d'intellisense ensuite, vous pouvez simplement mettre une classe dans l'une des assemblées qui lit la valeur de configuration et s'expose comme une propriété pour faciliter le référencement. Si c'est des données sensibles alors je ne voudrais pas le mettre dans un fichier de config, je voudrais juste compiler de toute façon puisque vous ne voulez pas compromettre votre application.
Voici la classe de référence de la valeur, ce qui vous donne intellisense, la capacité de changer facilement dans l'avenir, et sans avoir à recompiler tout
Il peut ne pas être la réponse à votre solution, mais il peut vous donner d'autres idées.
NameValueCollection
ou quelque chose de semblable au lieu de l'avoir à l'extraire de la statiqueAppSettings
de la propriété. Et puis à l'injecter via Cio.ouais, j'espérais qu'il y aurait une solution plus simple sans utiliser le web.config. J'avais l'habitude d'écrire mes propres ConfigWrapper et IConfig et une classe singleton comme mon CustomConfigManager d'avoir toutes ces propriétés en lecture seule et d'interagir avec le fichier physique qu'une seule fois. si un changement est nécessaire, l'application doit être redémarré. Le web est donc.config la Seule façon d'éviter ce problème?
Je ne suis pas sûr si c'est la seule façon de l'éviter. Je veux dire que vous persister dans un enregistrement de base de données. De cette façon, vous pouvez changer la valeur en cas de besoin et ne pas avoir à recompiler. Honnêtement, même si, ce n'est pas vraiment complexe d'une solution; il est assez simple de l'OMI.
c'est tout à fait acceptable aussi, mais mon œuvre encapsule la lecture à partir de la config complètement et empêche le code de client qui utilise la classe d'avoir à chercher un
NameValueCollection
pour la passer. Garder le il faiblement couplés. Si vous avez besoin d'écrire des tests unitaires contre la config de la classe (je ne sais pas pourquoi vous voulez, il n'y a pas de logique à l'essai), vous pouvez fournir un deuxième constructeur qui prend un NameValueCollection. Je pense que ce serait plus à le faire bien.Votre classe est étroitement couplée à la configuration du mécanisme de stockage. Mais le code client ne devrait pas construire des instances de
MyAppConfigSettings
. Le seul code de la constructionMyAppConfigSettings
devrait être le conteneur IoC. Je ne parle pas de test de la configuration de la classe, mais sur le test de classes qui dépendent de la configuration de la classe. Et des tests avec une autre configuration des sons assez standard pour moi.OriginalL'auteur jlafay
Il dépend. Si c'est vraiment une constante qui ne change pas, même dans les futures versions de votre code, puis
const
est très bien. Sinon, avec unstatic readonly
champ.Un
const
va s'incruster dans la convocation de l'assemblée, alors qu'avecstatic readonly
la convocation de l'assemblée ne contient qu'une référence sur le terrain. Cela signifieconst
nécessite la recompilation de tous les dépendants code chaque fois que vous modifiez la valeur, tandis quepublic readonly
utilise la nouvelle valeur, même sans avoir à recompiler l'appel de l'assemblée.Si vous souhaitez stocker de la "constante" dans un fichier de config, mais comme Intellisense, vous pouvez utiliser un bien public setter. Et puis le remplir à partir du fichier de configuration au moment de l'exécution. Mais je dirais que les valeurs de configuration ne doit pas être
static
en premier lieu. Pour les valeurs de configuration que j'avais utiliser un singleton, de la sorte, de préférence le Cio de la variation et de ne pas leClass.Instance
variation. Donc, je venais de définir une interface comme suit:Et des classes qui ont besoin de cette config le prendre comme un paramètre du constructeur:
Je suis assez sûr que la modification d'un static readonly champ n'a pas besoin de recompiler l'appelant. La convocation de l'assemblée ne contient que le nom de votre domaine, et non pas la valeur de celui-ci.
est correcte. Si vous utilisez une constante, que la valeur est insérée par le compilateur, alors que la readonly champ est inséré au moment de l'exécution (soit lors de la déclaration ou dans le constructeur, en fonction de comment mettre en œuvre le readonly valeur). Même static readonly serait fait à l'exécution, toutes les fois que les champs statiques de la classe sont initialisés.
Je suis d'accord, si il ya une possibilité qu'ils peuvent changer (et à cause de recompiler), alors qu'ils ne sont pas vraiment des constantes. Je préfère const car ils sont plus faciles à utiliser dans switch / case consolidés. Mais si vous parlez de la querystring & les clés de session, la modification de ces sera la cause d'une recompilation et un redéploiement de toute façon.
Peut-être que vous êtes confus par VS la reconstruction de tous les dépendants assemblées par défaut. Mais si vous prenez la nouvelle "static readonly" contenant de l'assemblée et il suffit de remplacer cette dll unique avec une version différente, tous les assemblages de construction sur il doit encore travailler, et d'utiliser les nouvelles valeurs.
OriginalL'auteur CodesInChaos
Si vous activez fxCop (outil d'analyse de code inclus dans Visual studio distribution), vous pouvez obtenir des sugestion pour le changement constant de devenir:
Je n'ai pas de compilateur sous la main,mais je suis surpris que le
static
mot-clé serait nécessaire, voire juridique, compte tenu de la nature d'unconst
valeur.blogs.msdn.com/b/csharpfaq/archive/2004/03/12/...
faites-vous référence à une version antérieure de cette réponse? Parce que
static readonly
a certainement un sens.static
est implicite lors de l'utilisation deconst
et non pas lors de l'utilisation dereadonly
.Il est possible que j'ai mal lu la réponse. Au moment de la publication de mon commentaire, j'ai pensé qu'il contenait à la fois
const
etstatic
dans la même déclaration.OriginalL'auteur habibillah
Je ne suis pas sûr si je comprends complètement le problème... vous allez avoir une solution pour le stockage des variables globales qui ne cause pas de recompilation d'assemblages qui font référence à ces variables globales si vous les changer? Si oui, alors pourquoi ne pas essayer de penser à la refonte de votre architecture que par la L'Inversion de Contrôle principe? Penser "ne nous appelez pas, nous vous appellerons" le hollywood principe. Si toutes les assemblées qui nécessitent quelques const appelez simplement une interface (qui elles-mêmes) qui expose une propriété avec la valeur qu'ils exigent, et puis vous avez un projet de constantes de mise en œuvre de ceux de l'interface (par le référencement de ces projets et la mise en œuvre de ces interfaces) ensuite, ces projets n'aurez plus jamais besoin recompilling lorsque vous modifiez la valeur de la constante.
Je suis sûr que vous savez de toute façon mais ont une lire sur le De SOLIDES principes, "D" étant la Dépendance principe d'Inversion (Inversion de Contrôle). Je pense que compte tenu de vos préoccupations (en supposant que j'ai bien compris vous avez droit), ils pourraient vraiment vous aider.
Un exemple de l'Inversion de Contrôle pourrait être aussi simple que:
MyService.dll :
MyConstants.dll :
De sorte que le myconstants.dll les références de la myservice.dll plutôt que l'inverse (sens myservices n'aurez pas besoin de recompiler). Ensuite, la phase de code (pour mettre tout cela en place, et injecter des dépendances) vie ailleurs.
Désolé si j'ai mal compris, de l'espoir qui aide bien!
Constant
ici, depuis une valeur de configuration n'est pas vraiment une constante. Si c'était vraiment une constante, nous n'aurions pas besoin DI ici.Wikipedia cite le je dans SOLIDE comme "Interface ségrégation principe". Je pense que le principe que vous voulez est "Pousser, ne tirez pas".
ouais que des sons sur la droite, vous savez ce que je veux dire. Je suis juste de se mêler avec certaines interprétations de DI je pense!
À quelqu'un d'autre qui lit mon commentaire ci-dessus - j'ai modifié un peu pour contenir la référence à des principes SOLIDES. Cheers @CodeInChaos !
OriginalL'auteur james lewis
Je préfère la 2ème option dans la plupart des cas, puisqu'il ne cause pas de problème (par copie de la valeur à d'autres assemblées). La vitesse a peut-être un plus lent que les constantes mais ce genre de nano-seconde vitesse est assez immature.
OriginalL'auteur Jeffrey Zhao
Vous pouvez utiliser le Cache de l'objet et de le définir dans le Mondial.asax
OriginalL'auteur Barry Kaye
Comme l'a dit avant, ce n'est pas le même scénario:
dans votre cas, j'irais avec const statique de la classe helper.
vous n'avez pas compris le problème.
OriginalL'auteur lnu