Quali sono le alternative al file resx

7

Sto sviluppando un'applicazione Windows e voglio archiviare tutto il testo per etichette, pulsanti di opzione, pulsanti, caselle di controllo e intestazioni di colonne delle griglie in un unico punto. Ho provato a utilizzare un file di classe, un file xml, una tabella di database e un file di risorse.

Ho scoperto che un file di classe è il modo migliore per archiviare tutti questi testi, ma voglio sapere se esiste un modo alternativo? Se sto usando un file di classe, dovrò ricompilare il progetto se qualche testo cambia.

Un file di risorse funzionerà correttamente per grandi quantità di dati? Che dire di un dizionario o di memorizzare dati in variabili?

    
posta sandeep.gosavi 30.08.2013 - 15:25
fonte

7 risposte

5

In breve: mi sembra una localizzazione delle risorse (tipi diversi come etichette statiche, testo, ecc.). In generale, le modifiche nel contenuto del file di risorse non dovrebbero richiedono una ricostruzione dell'applicazione.

Il dis-vantaggio per archiviare le risorse nelle classi , è che ogni modifica / modifica richiederà una ricostruzione dell'applicazione di forma vincente.

Will a resource file work properly for large amounts data?

Penso che la limitazione sia la limitazione della dimensione del file del sistema operativo e che sia 4 GB su sistemi a 32 bit, se non ricordo male. Per 64 bit dovrebbe essere ancora più grande. Comunque, allo scopo di memorizzare il testo statico, dovrebbe essere più che sufficiente.

Quindi, a mio parere, questo non dovrebbe essere fatto in nessun altro posto se il testo sarà statico.

Un approccio alternativo creerebbe una classe per controllare l'accesso ai tuoi file di risorse. Questa classe può essere utilizzata per archiviare le chiavi per accedere ai file delle risorse e avere un modo strongmente digitato per recuperare le risorse disponibili del progetto.

Alcuni riferimenti su risposte SE su localizzazione e risorse:

Riferimenti da MSDN :

risposta data 30.08.2013 - 15:31
fonte
3

Penso che tu abbia praticamente menzionato tutto.
Se vuoi qualcosa di flessibile, dove non hai bisogno di ricompilare, allora il DB potrebbe essere la tua migliore opzione.
Ma altrimenti andrei con .resx, dato che questo è lo standard.
Salvare il testo all'interno dei file di classe è una pessima idea.

    
risposta data 30.08.2013 - 13:37
fonte
2

Oltre al formato .resx, puoi anche utilizzare i file .txt o .restext, che sono in un formato più semplice (e più facile da leggere e modificare).

Creazione di file di risorse per app desktop (consultare la sezione "Risorse in file di testo")

Il formato è essenzialmente name = value , con la possibilità di avere commenti e compilazione condizionale.

Un'altra opzione consiste nell'usare qualsiasi sorgente o file di testo che si desidera e creare il file .resources binario manualmente o come parte di un passo di generazione. (vedi "Risorse in file .resrouces" dal link sopra).

In ogni caso, c'è un po 'più di lavoro per far sì che questi siano inclusi nel tuo progetto e nella compilazione, ma entrambi hanno il vantaggio di avere il supporto per più lingue, proprio come il file .resx.

    
risposta data 30.08.2013 - 14:01
fonte
2

In C #, è quasi certamente meglio usare un file di risorse (che è un file XML). Questo ti dà i seguenti vantaggi:

  • Rimuove la necessità di ricompilare l'intera soluzione per le modifiche del testo.
  • Consente la gestione delle stringhe da parte di qualcuno diverso dal codificatore (i codificatori non sono necessariamente le persone migliori per scrivere errori utente / messaggi informativi).
  • Consente una localizzazione abbastanza banale.
risposta data 30.08.2013 - 15:34
fonte
1

Avevo un requisito simile prima e ho memorizzato le risorse in un file .resx ma ho deciso di utilizzare le classi per memorizzare le chiavi.

Ad esempio, supponiamo di avere risorse per lo schermo di prelievo bancario.

Ho creato una classe semplice sulle linee di

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

Ho quindi implementato una classe per il recupero delle risorse. Il mio obiettivo era quello di avere un metodo strongmente tipizzato per estrarre risorse. Volevo anche rendere controllabile l'unità di recupero delle risorse. Ho estratto un'interfaccia per il recupero delle risorse: IResource .

Ogni volta che volevo utilizzare le risorse, avrei ottenuto un'implementazione tramite il contenitore IoC.

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

Infine, quando si trattava di usare la risorsa, avrei qualcosa sulla falsariga di:

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

Nella riga sopra, ho usato l'espressione lambda che mi ha permesso di visualizzare tutte le risorse disponibili tramite intellisense.

Quando si trattava di test delle unità, prendevo in giro IResource e impostavo le aspettative su di esso.

Ad esempio:

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

Si noti inoltre che è stata estratta un'interfaccia per il recupero delle risorse. Per questo motivo, siamo ora in grado di immagazzinare le risorse ovunque vogliamo. Ad esempio:

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
}

Ho scritto sopra in cima alla mia testa nel blocco note, quindi se hai qualche problema fammelo sapere e aggiungerò l'implementazione più tardi.

    
risposta data 30.08.2013 - 15:59
fonte
1

Ho appena fatto qualcosa di simile seguendo questa procedura dettagliata di CodeProject: link

È per creare più file di testo facilmente aggiornabili in file di risorse che puoi aggiungere al tuo progetto in modo da avere lingue diverse (nel mio caso, una casella combinata mi consente di cambiare tra tante lingue quante creo file di risorse per )

Il vantaggio di questo file .resx è che puoi avere solo 1 per lingua per progetto, invece di dover avere 1 per lingua per modulo

Solo qualcos'altro a cui pensare

    
risposta data 30.08.2013 - 13:51
fonte
0

Portable Object (.po) è molto popolare e praticamente uno standard al di fuori del mondo .NET. L'ho visto utilizzato in alcuni progetti C # (ad esempio link ). Non esiste un supporto ufficiale per questo, ma il formato non è così complesso e ci sono alcune librerie per questo: link

Il formato è decisamente più semplice di .resx poiché non è basato su XML. Ne hai anche molti strumenti, ad es. Pootle, Poedit e altro ...

Un'altra opzione è quella di utilizzare un formato semplice (o personalizzato) come JSON / YAML / TOML o anche qualcosa di semplice come Key=Value in testo semplice con alcune convenzioni di denominazione dei file come Locale.{languagecode2-country/regioncode2} . Potresti quindi incorporarlo come risorsa nel tuo assembly :) Ma poi devi trovare i tuoi strumenti di traduzione, o qualche convertitore da / po / resx per lavorare con gli strumenti esistenti.

Oltre a questo, .resx è il modo ufficiale e la prima scelta da seguire. Anche gli utensili sono decenti: link

    
risposta data 07.12.2018 - 13:22
fonte

Leggi altre domande sui tag