Como fazer herança de arquivos de recursos (resx)

9

Imagine que você está trabalhando em um projeto .Net 4.0 que é composto de centenas de assemblies, cada um com seu próprio arquivo de recursos (.resx) para localização. As cadeias localizadas são acessadas de C # através de classes geradas automaticamente com ResXFileCodeGenerator (que cria um arquivo "ResourceFile.Designer.cs"): string test = ResourceFile.TestString;

Cada conjunto possui cadeias localizadas que são particulares a ele, mas existem cadeias que são comuns a todos os conjuntos. Você diz a si mesmo que seria interessante ter essas "cadeias comuns" em um arquivo de recurso "pai", no qual o código seria retrocedido se a chave de recurso não estivesse disponível no arquivo de recurso "local". Você então diz "Ei! A herança poderia funcionar aqui". E, de fato, fazer algo parecido com isso no arquivo de designer gerado automaticamente funciona:     %código% Ou seja, as sequências não definidas em internal class ResourceFile : ParentResourceFile , mas definidas em ResourceFile , ainda podem ser acessadas com ParentResourceFile .

Mas algo no cabeçalho do arquivo do designer causa problemas: " As alterações nesse arquivo podem causar um comportamento incorreto e será perdido se o código for regenerado . " Além disso, você sabe tocar nos arquivos de designer gerados automaticamente é desaprovado. Então você vem aqui e pergunta:

  • Quando o ResXFileCodeGenerator gera / regenera o designer classe?
  • Existe uma maneira de desativar essa geração automática?
  • Teremos para renunciar às vantagens do ResXFileCodeGenerator e implementar próprio manuseio do ResourceManager?

E você diz "obrigado".

    
por Fueled 29.07.2011 в 16:39
fonte

1 resposta

5

Depois de investigar o problema por um tempo, resolvi uma solução: faça a herança não nos próprios arquivos de recursos, mas nas classes que precisam acessar os recursos "pai".

Você só precisa ter uma classe base cujo projeto inclua um arquivo de recurso "mestre" e defina a propriedade CustomTool desse arquivo de recurso como PublicResXFileCodeGenerator (a parte "Pública" é importante, pois criará uma public class, em oposição a internal one). Uma restrição é que PublicResXFileCodeGenerator está disponível apenas começando com o VS2008 (este artigo do CodeProject poderia ser útil).

Em seguida, nas classes que precisam acessar os recursos "mestres", simplesmente herde da classe base e acesse os recursos como este:

public class ChildClass : BaseClass
{
    string test = BaseClass.BaseResourceFile.TestString; // a common resource
    string localResource = ResourceFile.OtherString;     // a local resource
}

Uma desvantagem desta solução é que você deve referenciar explicitamente o BaseResourceFile para acessar os recursos definidos lá; não há retorno para a classe pai como se a herança fosse feita diretamente entre as classes Resource.

E para a posteridade, responderei minhas próprias perguntas:

  • Quando o ResXFileCodeGenerator gera / regenera o designer classe?

    Sempre que um recurso é adicionado / removido / modificado.

  • Existe uma maneira de desativar essa geração automática?

    Não. E, de qualquer forma, uma ferramenta "gerador de código" sem geração automática seria inútil, não acha?

  • Teremos que renunciar as vantagens do ResXFileCodeGenerator e implementar nossa próprio manuseio do ResourceManager?

    Não, veja a resposta acima.

Também consideramos a implementação de uma solução usando arquivos "vinculados" (a partir do diálogo "Adicionar item existente", usando a opção "Adicionar como link") onde um arquivo de recurso pai seria vinculado a todos os nossos assemblies, mas desde nossos assemblies já herdado de uma classe base, parecia muito melhor seguir o caminho da herança.

Não me sinto realmente à vontade para aceitar a minha resposta, por isso, se alguém encontrar uma solução ou melhorias melhores na minha solução, aceito de bom grado isso. Isto é, se alguém se importa.

    
por Fueled 26.08.2011 / 16:51
fonte