Implementazione delle proprietà del modello dinamico in base al paese

0

Sto avendo un dilemma in cui avrei bisogno di implementare un modo migliore per il nostro modello di progetto con proprietà dinamiche a seconda del Paese.

Quindi, cosa succede nella nostra applicazione, abbiamo campi dinamici per un progetto a seconda del paese in cui si trova. Ad esempio il modello di progetto in Australia ha Foo ma non nel modello di progetto in America.

public class ProjectAustralia 
{
 public string Bar {get; set;}
 public string Foo {get; set; }
}

public class ProjectAmerica 
{
 public string Bar {get; set; }
}

La mia implementazione attuale è che ho definito tutto in una classe, ma questo diventerà più grande poiché implementeremo altri paesi con le loro proprietà per ProjectModel .

Quale sarebbe il modo migliore per farlo? Grazie

Aggiornamento: Per aggiungere ulteriori dettagli, l'applicazione è uno strumento di gestione dei progetti per i ricercatori, quindi per ogni paese hanno una propria forma di progetto che ha campi diversi. Per la base di questo Progetto ha Name , Stage , Description , Keywords e il resto dipende dal paese in cui viene utilizzato un progetto. Usiamo anche NoSQL per salvare dinamicamente queste entità del progetto. Non potrei discutere ulteriormente a causa della natura dell'applicazione. Spero che questo aiuti.

    
posta rpmansion 06.09.2018 - 10:44
fonte

1 risposta

2

Una soluzione è usare molte interfacce:

interface IFoo
{
    string Foo {get; set; }
}

interface IBar
{
    string Bar {get; set; }
}

e per far sì che le classi implementino le interfacce rilevanti:

public class ProjectAustralia : IFoo, IBar
{
    public string Bar {get; set;}
    public string Foo {get; set; }
}

public class ProjectAmerica : IBar
{
    public string Bar {get; set; }
}

In questo modo, limiti gli aspetti dinamici alla serializzazione / deserializzazione, ad esempio da JSon nel tuo database NoSQL.

Per il resto del sistema, è possibile utilizzare semplici controlli di tipo per determinare quali funzioni la classe ha:

if (project is IFoo fooProject)
{
    // do something with fooProject.Foo
}

Se questo approccio è pratico per la tua situazione dipende da come sono coinvolte le proprietà. Ad esempio, dovendo elencare le 50 interfacce che gli strumenti di classe diventerebbero estremamente onerosi.

Se hai molte proprietà diverse, un approccio alternativo è di avere una sola classe di progetto e di usare un dizionario per contenere quelle proprietà:

class Project
{
    public string Name {get; set}
    public string Stage {get; set}
    public string Description {get; set}
    public string Keywords {get; set}
    public Dictionary<string, string> Properties { get; set }
}

e quindi aggiungere Foo , Bar ecc. al dizionario. Questo offre meno codice boilerplate e maggiore flessibilità. Ma perde la sicurezza del tipo di runtime in quanto non c'è niente da fermare Foo che viene aggiunto in America, per esempio.

    
risposta data 06.09.2018 - 11:11
fonte

Leggi altre domande sui tag