Was sind die Alternativen zur Resx-Datei?

9

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?

sandeep.gosavi
quelle
1
@ sandeep.gosavi - Sie sagten, eine Klassendatei sei der beste Weg, um Informationen zu speichern, und forderten einen alternativen Weg an. Die alternative Möglichkeit besteht darin, eine Ressourcendatei zu verwenden. Ihre Frage ist sehr vage und zeigt fast keinen Forschungsaufwand von Ihrer Seite.
Ramhound
2
@ sandeep.gosavi - Also gib ihm die Wahl. Sie fragen nach dem "besten Weg", aber Sie haben ihn bereits.
Ramhound
1
Verwandte, aber keine Duplikate: Klassendesign für internationalisierte Objekte , Internationalisierung: Woran sollte man denken? und effektive Strategien zur Lokalisierung in .NET . Ich weiß, dass der Beitrag nicht explizit auf I18N verweist, aber wenn er wie eine Ente
quakt
1
Bitte kreuzen Sie nicht post stackoverflow.com/q/18531904/839601 . Die Frage zum Stapelüberlauf wurde möglicherweise migriert. Sie mussten es nur markiert haben.
ChrisF

Antworten:

5

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 besteht darin , dass für jede Änderung / Modifikation eine Neuerstellung der Win-Form-Anwendung erforderlich ist.

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, um den Zugriff auf Ihre Ressourcendateien zu steuern. 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 Referenzen zu SE-Antworten zu Lokalisierung und Ressourcen:

Referenzen von MSDN :

Yusubov
quelle
1
Würde es Ihnen etwas ausmachen, mehr darüber zu erklären, was diese Ressourcen bewirken und warum Sie diese als Antwort auf die gestellte Frage empfehlen? "Nur-Link-Antworten" sind bei Stack Exchange nicht ganz willkommen
Mücke
@Yusubov: Ich habe Ihre Links durchgesehen, Ressource ist eine gute Option, aber ich bin auf der Suche nach einer anderen Option.
Sandeep.gosavi
1
Die Antwort enthält nicht nur Links, sondern eine Erklärung mit der vorgeschlagenen Meinung zu der Lösung, die funktionieren wird.
Yusubov
@ sandeep.gosavi: IMHO funktioniert die Auswahl von Ressourcendateien als Lösung für Ihre Win-Forms-Anwendung. Alternativ können Sie eine Klasse erstellen, die den Zugriff auf Ihre externen Ressourcen steuert.
Yusubov
@ Yusubov: Was ist IMHO?
Sandeep.gosavi
3

Ich denke, Sie haben so ziemlich alles erwähnt.
Wenn Sie etwas Flexibles wünschen, bei dem 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.

Remy
quelle
2

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 = valuemit 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.

Crashmstr
quelle
2

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.
TZHX
quelle
Was ist die Alternative für .resx-Dateien?
Tohid
"Entfernt die Notwendigkeit, die gesamte Lösung für Textänderungen neu zu kompilieren." - Nein, wenn die Ressource eingebettet ist
Konrad
1

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 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 IResourceund 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 Ressourcen jetzt ü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.

CodeART
quelle
Der Nachteil beim Speichern von Ressourcen in Klassen besteht darin, dass für jede Änderung / Modifikation eine
Neuerstellung
Ich bin wenig verwirrt, bitte korrigieren Sie mich, wenn ich falsch liege. Ich habe verstanden, dass Sie Daten in einer Ressourcendatei speichern und zum Abrufen eine Klasse verwenden.
Sandeep.gosavi
1
Sie werden Klassen nicht ändern, da das Ändern von Klassen das Ändern von Ressourcenschlüsseln bedeutet. Wenn Sie Ressourcenschlüssel ändern, bedeutet dies, dass Sie das erste Mal nicht darüber nachgedacht haben. Was Sie möglicherweise ändern, sind tatsächliche Einträge in der Ressourcendatei, XML-Datei oder Datenbank. Dadurch wird die App neu kompiliert. Wenn Ihre Anforderungen keine Neukompilierung zulassen, lassen Sie den größten Teil meines Beispiels unverändert und implementieren Sie einen Ressourcenanbieter für die Datenbank oder eine andere Quelle, der die App nicht neu kompiliert.
CodeART
1
@ sandeep.gosavi Ich habe eine Klasse zum Speichern von Ressourcenschlüsseln und eine Klasse zum Abrufen von Ressourcen. Vorteil ist, dass ich nicht mehr jedes Mal "magische Zeichenfolgen" verwenden muss, wenn ich eine Ressource herausziehe, sondern stattdessen eine Liste der verfügbaren Ressourcen über Intellisense erhalte. Ich kann meinen Ressourcenanbieter auch problemlos ersetzen (von Resx zur Datenbank). Endlich ist es leicht zu testen.
CodeART
1
OK ich habe es. Können Sie mir bitte einen Demo-Code geben, da ich neu in dotnet bin
sandeep.gosavi
1

Ich habe gerade etwas Ähnliches nach dieser CodeProject-exemplarischen Vorgehensweise 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

iabbott
quelle
1

Portable Object (.po) ist sehr beliebt und außerhalb der .NET-Welt ein Standard. 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. B. 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=Valueim Klartext mit einer Dateinamenskonvention wie zu verwenden Locale.{languagecode2-country/regioncode2}. Sie könnten es dann als Ressource in Ihre Baugruppe 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. Die Werkzeuge sind auch anständig: https://github.com/tom-englert/ResXResourceManager

Konrad
quelle