Algumas vezes no passado, eu queria armazenar dados em código. Seriam dados que raramente mudam e são usados em locais onde o acesso a um banco de dados não é possível, prático ou desejável. Um pequeno exemplo seria armazenar uma lista de países. Para isso, você pode fazer algo como:
public class Country
{
public string Code { get; set; }
public string EnglishName {get;set;}
}
public static class CountryHelper
{
public static List<Country> Countries = new List<Country>
{
new Country {Code = "AU", EnglishName = "Australia"},
...
new Country {Code = "SE", EnglishName = "Sweden"},
...
};
public static Country GetByCode(string code)
{
return Countries.Single(c => c.Code == code);
}
}
Eu já fiz isso no passado porque os conjuntos de dados eram relativamente pequenos e os objetos bastante simples. Agora estou trabalhando com algo que terá objetos mais complexos (5 a 10 propriedades cada, algumas propriedades sendo dicionários) e cerca de 200 objetos no total.
Os dados em si mudam muito raramente e, quando mudam, não são tão importantes assim. Portanto, rolá-lo para a próxima versão está perfeitamente bem.
Estou planejando usar o T4 ou o ERB ou alguma outra solução de modelo para transformar minha fonte de dados em algo armazenado estaticamente no assembly.
Parece que minhas opções são
- Armazene os dados em XML. Compile o arquivo XML como um recurso de montagem. Carregue os dados conforme necessário, armazene os dados carregados em um dicionário para desempenho de uso repetido.
- Gere algum tipo de objeto estático ou objetos que são inicializados na inicialização.
Tenho certeza de que entendi as implicações de desempenho da opção 1. Pelo menos, meu palpite é que não teria desempenho estelar.
Quanto à opção 2, não sei o que fazer. Não sei o suficiente sobre as partes internas da estrutura .NET para saber a melhor maneira de realmente armazenar esses dados no código C # e as melhores maneiras de inicializá-los. Eu usei o refletor .NET para ver como System.Globalization.CultureInfo.GetCulture(name)funciona, pois esse é realmente um fluxo de trabalho muito semelhante ao que eu quero. Infelizmente essa trilha terminou em um ponto extern, então não há dicas. A inicialização de uma propriedade estática com todos os dados, como no meu exemplo, é o caminho a percorrer? Ou seria melhor criar os objetos sob demanda e depois armazená-los em cache, assim?
private static readonly Dictionary<string, Country> Cache = new Dictionary<string,Country>();
public static Country GetByCode(string code)
{
if (!Cache.ContainsKey(code))
return Cache[code];
return (Cache[code] = CreateCountry(code));
}
internal static Country CreateCountry(string code)
{
if (code == "AU")
return new Country {Code = "AU", EnglishName = "Australia"};
...
if (code == "SE")
return new Country {Code = "SE", EnglishName = "Sweden"};
...
throw new CountryNotFoundException();
}
A vantagem de criá-los de uma só vez em um membro estático é que você pode usar o LINQ ou qualquer outra coisa para examinar todos os objetos e consultá-los, se desejar. Embora eu suspeito que fazer isso tenha uma penalidade no desempenho da inicialização. Espero que alguém tenha experiência com isso e possa compartilhar suas opiniões!