it-swarm.com.de

Was sind die Alternativen zur Resx-Datei?

Ich entwickle eine Windows-Anwendung und möchte den gesamten Text für Beschriftungen, Optionsfelder, Schaltflächen, Kontrollkästchen und Spaltenüberschriften von Rastern an einer Stelle speichern. Ich habe versucht, eine Klassendatei, eine XML-Datei, eine Datenbanktabelle und eine Ressourcendatei zu verwenden.

Ich habe festgestellt, dass eine Klassendatei der beste Weg ist, um all diese Texte zu speichern, aber ich möchte wissen, ob es einen alternativen Weg gibt. Wenn ich eine Klassendatei verwende, muss ich das Projekt neu kompilieren, wenn sich Text ändert.

Funktioniert eine Ressourcendatei für große Datenmengen ordnungsgemäß? Was ist mit einem Wörterbuch oder dem Speichern von Daten in Variablen?

9
sandeep.gosavi

Kurz gesagt: Es klingt für mich nach einer Lokalisierung von Ressourcen (verschiedene Typen wie statische Beschriftungen, Text usw.). Im Allgemeinen sollten Änderungen am Inhalt der Ressourcendatei keine Neuerstellung der Anwendung erfordern .

Der Nachteil beim Speichern von Ressourcen in Klassen ist, dass jede Änderung Für eine Änderung muss die Win-Form-Anwendung neu erstellt werden.

Funktioniert eine Ressourcendatei für große Datenmengen ordnungsgemäß?

Ich denke, die Einschränkung ist die Dateigrößenbeschränkung des Betriebssystems und das sind 4 GB auf 32-Bit-Systemen, wenn ich mich richtig erinnere. Für 64 Bit sollte es noch größer sein. Zum Speichern des statischen Textes sollte er jedoch mehr als ausreichend sein.

Daher sollte dies meiner Meinung nach nirgendwo anders gemacht werden , wenn der Text statisch ist.

Ein alternativer Ansatz wäre das Erstellen einer Klasse zur Steuerung des Zugriffs auf Ihre Ressourcendateien. Diese Klasse kann verwendet werden, um die Schlüssel für den Zugriff auf Ihre Ressourcendateien zu speichern und eine stark typisierte Methode zum Abrufen verfügbarer Ressourcen des Projekts zu verwenden.

Einige Verweise auf SE-Antworten zu Lokalisierung und Ressourcen:

Referenzen aus [~ # ~] msdn [~ # ~] :

5
Yusubov

Ich denke, Sie haben so ziemlich alles erwähnt.
Wenn Sie etwas Flexibles wünschen, das Sie nicht neu kompilieren müssen, ist die Datenbank möglicherweise die beste Option.
Aber sonst würde ich mit .resx gehen, da dies der Standard ist.
Das Speichern von Text in Klassendateien ist eine ziemlich schlechte Idee.

3
Remy

In C # ist es mit ziemlicher Sicherheit besser, eine Ressourcendatei (eine XML-Datei) zu verwenden. Dies bietet Ihnen folgende Vorteile:

  • Entfernt muss die gesamte Lösung für Textänderungen neu kompilieren.
  • Ermöglicht die Verwaltung von Zeichenfolgen durch eine andere Person als den Codierer (Codierer sind nicht unbedingt die besten Personen, um Benutzerfehler-/Informationsnachrichten zu schreiben).
  • Ermöglicht eine ziemlich triviale Lokalisierung.
2
TZHX

Neben dem .resx-Format können Sie auch .txt- oder .restext-Dateien verwenden, die in einem einfacheren (und leichter zu lesenden und zu bearbeitenden) Format vorliegen.

Erstellen von Ressourcendateien für Desktop-Apps (siehe Abschnitt "Ressourcen in Textdateien")

Das Format ist im Wesentlichen name = value, mit der Fähigkeit, Kommentare und bedingte Kompilierung zu haben.

Eine andere Möglichkeit besteht darin, die gewünschte Quell- oder Textdatei zu verwenden und die binäre .resources-Datei entweder manuell oder als Teil eines Erstellungsschritts zu erstellen. (Siehe "Ressourcen in .resrouces-Dateien" über den obigen Link).

In beiden Fällen ist etwas mehr Arbeit erforderlich, um diese in Ihr Projekt zu integrieren und zu kompilieren. Beide haben jedoch den Vorteil, dass sie mehrere Sprachen unterstützen, genau wie die .resx-Datei.

2
crashmstr

Ich hatte zuvor eine ähnliche Anforderung und habe Ressourcen in einer .resx-Datei gespeichert, aber ich habe mich entschieden, Klassen zum Speichern der Schlüssel zu verwenden.

Angenommen, ich habe Ressourcen für den Bildschirm für Bankabhebungen.

Ich habe eine einfache Klasse nach dem Vorbild von erstellt

public class BankingWithdrawalResource
{
   public string WithdrawFunds { get; set; }
}

Ich habe dann eine Klasse zum Abrufen von Ressourcen implementiert. Mein Ziel war eine stark typisierte Art, Ressourcen herauszuholen. Ich wollte auch die Ressourcenabrufeinheit testbar machen. Ich habe eine Schnittstelle zum Abrufen von Ressourcen extrahiert: IResource.

Jedes Mal, wenn ich Ressourcen verwenden wollte, erhielt ich eine Implementierung über den IoC-Container.

var resource = Dependency.Resolve<IResource>();

Wenn es darum ging, die Ressource zu nutzen, hätte ich schließlich Folgendes:

resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)

In der obigen Zeile habe ich einen Lambda-Ausdruck verwendet, mit dem ich alle verfügbaren Ressourcen über Intellisense anzeigen konnte.

Wenn es um Unit-Tests ging, verspottete ich IResource und stellte Erwartungen daran.

Zum Beispiel:

resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();

Beachten Sie auch, dass wir eine Schnittstelle zum Abrufen von Ressourcen extrahiert haben. Aus diesem Grund können wir jetzt Ressourcen überall speichern, wo wir wollen. Zum Beispiel:

public class DatabaseResource : IResource
{
   // Logic to retrieve resources from database
   // Won't cause recompilation
}

public class XmlResource : IResource
{
   // Logic to retrieve resources from xml files
}

public class DefaultResource : IResource
{
   // Will cause recompilation as resources are stored in .resx
}

Ich habe oben von oben in den Notizblock geschrieben. Wenn Sie also Probleme haben, lassen Sie es mich wissen und ich werde die Implementierung später hinzufügen.

1
CodeART

Ich habe nach dieser CodeProject-exemplarischen Vorgehensweise gerade etwas Ähnliches getan: Link

Es dient dazu, mehrere leicht aktualisierbare Textdateien in Ressourcendateien zu verwandeln, die Sie Ihrem Projekt hinzufügen können, um verschiedene Sprachen zu erhalten (in meinem Fall kann ich in einem Kombinationsfeld zwischen so vielen Sprachen wechseln, für die ich Ressourcendateien erstelle).

Dies hat gegenüber .resx-Dateien den Vorteil, dass Sie nur 1 pro Sprache und Projekt haben können, anstatt 1 pro Sprache und Formular

Nur etwas anderes zum Nachdenken

1
iabbott

Portable Object (.po) ist sehr beliebt und ein Standard außerhalb der .NET-Welt. Ich habe gesehen, dass es in einigen C # -Projekten verwendet wurde (z. B. https://github.com/OrchardCMS/OrchardCore/tree/d729a2048a4390380d99e7be9f7968ff8f8e9271/src/OrchardCore/OrchardCore.Localization.Core ). Es gibt keine offizielle Unterstützung dafür, aber das Format ist nicht so komplex und es gibt einige Bibliotheken dafür: https://github.com/neris/NGettext

Das Format ist definitiv einfacher als .resx, da es nicht auf XML basiert. Sie haben auch viele Werkzeuge dafür, z. pootle, poedit und mehr ...

Eine andere Möglichkeit besteht darin, ein einfaches (oder benutzerdefiniertes) Format wie JSON/YAML/TOML oder sogar etwas so Einfaches wie Key=Value Im Klartext mit einer Dateinamenskonvention wie Locale.{languagecode2-country/regioncode2} Zu verwenden. Sie können es dann als Ressource in Ihre Assembly einbetten :) Aber dann müssen Sie sich ein eigenes Übersetzungswerkzeug oder einen Konverter für/von po/resx einfallen lassen, um mit dem vorhandenen Werkzeug arbeiten zu können.

Abgesehen davon ist .resx der offizielle Weg und die erste Wahl. Das Werkzeug ist auch anständig: https://github.com/tom-englert/ResXResourceManager

1
Konrad