2009-05-11 19 views
4

Ich schreibe eine C# -Anwendung, die eine lange "hart codierte" Zeichenfolge verwendet.Verwenden Sie eine externe Datei oder Ressource?

Aus Gründen der Wartungsfreundlichkeit habe ich beschlossen, diese Zeichenfolge in eine externe Textdatei zu schreiben und diese zu laden. Ist das eine gute Idee? Die Extra-I/O erscheint in diesem Fall nicht groß.

Ich weiß, dass ich auch eine Option zum Einbetten dieser Datei als RESX-Ressource haben. Ist das eine bessere Idee? Die Datei muss nie lokalisiert werden.

Antwort

14

Wenn Sie beabsichtigen, Benutzer/Administratoren zu ermöglichen, um die Zeichenfolge zu ändern, ich stimme mit den anderen Antworten, und ich würde vorschlagen, dass es in den Einstellungen setzen.

Wenn Sie nicht möchten, dass es nach der Bereitstellung bearbeitet werden kann und es nur von Ihnen und Ihren Entwicklern geändert wird, dann würde ich es in eine eingebettete Ressource einfügen (dies ist nicht das Gleiche wie eine .resx-Datei)). Sie würden es zur Laufzeit wie folgt zu lesen:

Assembly assembly = Assembly.GetExecutingAssembly(); 
Stream stream = assembly.GetManifestResourceStream(“MyAssemblyNamespace.MyTextFile.txt”); 
StreamReader reader = new StreamReader(stream); 
string theText = streamReader.ReadToEnd(); 

Update: Diese Lösung ist, die leicht zu pflegen ist. Die .txt-Datei ist nur eine weitere Datei in Ihrem Lösungs-Explorer in Visual Studio und Sie können sie wie jede andere Datei bearbeiten, unter Quellcodeverwaltung wie jede andere Datei usw. aufbewahren. Um sie zu einer eingebetteten Ressource zu machen, ändern Sie Build Aktion im Eigenschaftsfenster auf "Eingebettete Ressource".

Das Endergebnis ist, dass Ihre Datei (en) in Ihre DLL eingebettet werden, so dass Sie nur 1 DLL anstelle einer DLL und einen Ordner mit Dateien verteilen müssen, die sich zusammen bewegen müssen.

Update 2: In Bezug auf "Produktion Debugging" ist dies eine sehr statische Lösung, und Sie können den Inhalt der Textdatei zur Laufzeit nicht ändern, da die Datei in der DLL bei der Kompilierung gebacken wird Zeit. Um den Inhalt der Datei zu lesen, können Sie Tools wie reflector verwenden, um die eingebetteten Ressourcen einer DLL anzuzeigen. Sie könnten auch ein einfaches Befehlszeilentool schreiben, das alle eingebetteten TXT-Dateien aus einer DLL in einzelne Dateien ablegt, die Sie betrachten können.

Für die Speichernutzung gibt es keine effizientere Lösung als "Ich lade es nur genau dann aus einer Datei in den Speicher, wenn es benötigt wird". Sie müssen entscheiden, ob die verbesserte Wartbarkeit und Bereitstellung die Kosten von etwas mehr Speicher wert ist, wenn Ihre DLL für Ihre spezifische Situation in Arbeitsspeicher geladen wird. Das heißt, Sie haben nicht gesagt, wie groß diese Dateien sind. Wenn sie wirklich riesig sind (Megabytes +), würde ich wahrscheinlich nicht verwenden diese Lösung und würde mit losen Dateien auf der Festplatte gehen. Wenn sie im Allgemeinen ziemlich klein sind (Hunderte von Kilobytes), würde ich mir keine Gedanken um den zusätzlichen Speicher machen, es sei denn, Sie befinden sich in einer Art eingebetteter Gerätesituation, in der der RAM wirklich eng ist.

+0

Danke - siehe meinen Kommentar zu den anderen Antworten, wie erfüllt diese Lösung meine Anforderungen? –

+0

hinzugefügt einige Kommentare über Wartbarkeit ... –

+0

Danke - aber was ist: 1. "Produktion Debugging" - wenn ich einige Verdacht habe, dass es Probleme mit der Version gibt es nicht einfacher für mich, die externe Textdatei zu öffnen? 2. Nehmen wir an, die Saite wird sehr groß und es wird auch andere Saiten geben. Mit Ihrer Lösung gehen sie alle in den Speicher, wenn die DLL geladen wird und machen auch ihre Größe groß. Wenn sie eine externe Datei sind, werden sie nur geladen, wenn (und wenn) ich sie brauche. –

1

Ich würde vorschlagen, Anwendungseinstellungen zu verwenden.

Sie können diesem MSDN-Link how to use Application and User Settings folgen.

+0

Danke, siehe meine anderen Kommentare - Ich bin mir nicht sicher, wie skalierbar das ist –

1

Ich würde dies in eine application configuration file setzen.

+0

Danke, siehe meine anderen Kommentare - Ich bin mir nicht sicher, wie skalierbar das ist –

1

Noch besser wäre es, eine Einstellungsdatei zu Ihrem Projekt hinzuzufügen. Sie können dann problemlos Konfigurationseinstellungen über Visual Studio hinzufügen. Siehe this link.

Sie könnten dann die Zeichenfolge zugreifen, indem Sie die folgende Verwendung:

Settings.Default.MyString; 

Außerdem werden Einstellungen stark typisiert, so dass Sie alle Konvertierungen nicht tun müssen, wenn Sie sie abrufen.

+0

Danke - siehe meinen Kommentar zu den anderen Antworten, wie geht das Lösung erfüllt meine Anforderungen? –

4

Warum nicht eine appSetting in Ihrer web/app.config Datei machen?

<appSettings> 
    <add key="MyLongString" value="This is a really long string value that I don't want hardcoded" /> 
</appSettings> 

Dann im Code:

using System.Configuration; //To ease your typing pains 

var myReallyLongString = ConfigurationManager.AppSettings["MyLongString"]; 
+0

Meine .dll implementiert einen Erweiterungspunkt für eine andere Anwendung, so dass ich app.config nicht ändern darf. Selbst wenn ich wäre - app.config wird beim Start geladen, aber meine Codezeile darf niemals aufgerufen werden, deshalb möchte ich diese Zeichenfolge nicht ohne Grund im Speicher haben. Ich bin vor allem in Wartbarkeit interessiert: - Welche Option ist am einfachsten zu pflegen? - Was wird am besten sein, falls ich "production debugging" brauche? - Was ist, wenn ich so viele Dateien haben muss? –

0

Um Ihre Frage direkter zu beantworten, wäre die "beste Vorgehensweise", eine Ressourcendatei für jede lokalisierbare Zeichenfolge (auch wenn Sie sie nicht lokalisieren) in Ihrer Anwendung zu verwenden. Dies ermöglicht Ihnen den kompilierbaren Zugriff auf die Zeichenfolge und verhindert, dass sie als separate Datei zur Bereitstellung mit Ihrer Anwendung externalisiert wird.

Ich schlage vor, diesen Ansatz zu verwenden; Einstellungen sind ähnlich, sollten aber nicht verwendet werden, es sei denn, das, was Sie dort speichern, repräsentiert eine Einstellung. Konstanten sind die andere Option, aber im Fall einer langen Zeichenfolge würde ich mich von ihnen fernhalten, nur aus Gründen der Wartbarkeit.

Verwandte Themen