Eu tinha um requisito semelhante antes e armazenei recursos em um arquivo .resx, mas decidi usar classes para armazenar as chaves.
Por exemplo, digamos que tenho recursos para a tela de saque bancário.
Eu criei uma classe simples nas linhas de
public class BankingWithdrawalResource
{
public string WithdrawFunds { get; set; }
}
Eu implementei uma classe para recuperar recursos. Meu objetivo era ter uma maneira fortemente tipada de extrair recursos. Eu também queria tornar a unidade de recuperação de recursos testável. Eu extraído uma interface para recuperar recursos: IResource
.
Cada vez que eu queria usar recursos, eu recebia uma implementação por meio do contêiner de IoC.
var resource = Dependency.Resolve<IResource>();
Finalmente, quando se tratava de usar o recurso, eu teria algo nas linhas de:
resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)
Na linha acima, usei a expressão lambda que me permitia visualizar todos os recursos disponíveis por meio do intellisense.
Quando se tratava de testes de unidade, eu zombava IResource
e estabelecia expectativas.
Por exemplo:
resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();
Observe também que extraímos uma interface para recuperação de recursos. Por esse motivo, agora podemos armazenar recursos em qualquer lugar que desejarmos. Por exemplo:
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
}
Eu escrevi acima do topo da minha cabeça no bloco de notas, então se você tiver algum problema, avise-me e adicionarei a implementação mais tarde.