Qual è un buon posto, in OO, per memorizzare una stringa che viene utilizzata in molti posti?

2

Ho una stringa che viene utilizzata in alcuni punti.

string portalLoginPath = $"{Request.Scheme}{Uri.SchemeDelimiter}{Request.Host}/Account/Login";

Stavo pensando di creare una classe statica con una stringa const per memorizzarla.

public static class StringConsts{
public const string portalPath = $"{Request.Scheme}{Uri.SchemeDelimiter}{Request.Host}/Account/Login";
}

C'è un modo più semplice per farlo?

Sto costruendo in ASP.NET Core MVC

    
posta JohnOsborne 14.12.2018 - 22:32
fonte

4 risposte

7

In C # una stringa preceduta da $ è una stringa interpolata.

Una stringa interpolata è un costrutto che entrambi

  • dichiara una stringa letterale e,
  • chiede al compilatore di interpolare variabili nomi / espressioni all'interno della stringa.

Questi due non possono essere separati: non conosco alcun modo per dichiarare la stringa al di fuori del contesto in cui il compilatore troverà le variabili, e non c'è modo di chiedere l'interpolazione di una stringa memorizzata esternamente nel contesto di uno scope che ha le variabili di interesse.

Quindi, non c'è modo di mettere una stringa di tipo $ "{}" ovunque ma all'interno del codice che la usa.

L'unico modo per mettere la stringa altrove (oltre che incorporata nel codice) è di rinunciare all'interpolazione. Nel tuo caso tutto ciò che sarebbe rimasto è "/Account/Login" , lasciando che tu usi le espressioni in una stringa. Formattazione dettagliata.

    
risposta data 14.12.2018 - 22:44
fonte
4

Una classe statica è una buona idea. Una cosa a cui prestare attenzione è che la classe si riempie di un mucchio di stringhe, quindi si potrebbe avere un piccolo contesto di ciò per cui la stringa è effettivamente utilizzata.

Un modo per risolvere questo è avere il contesto nel nome della classe. Invece di StringConsts , puoi chiamare questo PortalConsts (o qualsiasi altra cosa abbia più senso). In questo modo puoi organizzare le tue stringhe per classe in modo che non diventi disorganizzato.

    
risposta data 14.12.2018 - 22:41
fonte
1

Poiché quello che vuoi è interpolare, ciò che stai descrivendo non è una costante ma una funzione. In tal caso potresti utilizzare un delegato:

public delegate string PortalPathFormatFunction(string scheme, string delimiter, 
    string host);

La ragione per cui utilizzerei un delegato invece di solo Func<string, string, string, string> è che identifica lo scopo di una funzione e la disambigura da altre funzioni con la stessa firma.

Potresti quindi implementarlo in questo modo (la denominazione è difficile)

public static class PathFormats
{
    public static PortalPathFormatFunction GetPortalPath { get; } 
        = (scheme, delimiter, host) => $"{scheme}{delimiter}{host}/Account/Login";
}

o solo

public static string GetPortalPath(string scheme, string delimiter, string host) => 
    $"{scheme}{delimiter}{host}/Account/Login";

Preferisco il primo perché specifica che la funzione deve corrispondere al delegato, come una classe che implementa un'interfaccia. Se qualcuno cambia la funzione in modo che non corrisponda più al delegato, voglio che l'errore del compilatore sia presente, dicendo loro di non farlo, invece che altrove.

    
risposta data 27.12.2018 - 17:26
fonte
0

Non dovresti semplicemente pensare a questo come a "una stringa che deve essere condivisa" - "stringhe" sono una definizione tecnica, non parte del tuo OO o modello di dominio. Chi, nel tuo sistema, conoscerà l'url di accesso al portale? Probabilmente una sorta di LoginManager , o forse PortalConnection componente, che potrebbe anche esporre questo percorso se necessario.

Ovviamente, con questo PortalConnection , potresti vedere che ha più senso, dal punto di vista dell'incapsulamento, a non esporre quel percorso di stringa, ma esporre invece un metodo Login() su il tuo PortalConnection che gestisce la registrazione nel portale in un'unica posizione, invece di esporre il percorso, che è un dettaglio di implementazione, non dovrebbe essere responsabilità di ogni componente del tuo sistema sapere come accedere.

    
risposta data 15.12.2018 - 09:17
fonte

Leggi altre domande sui tag