Pergunta

Eu estou procurando maneiras para tornar a nossa aplicação mais extensível e mais fácil de manipular sem ter que alterar o web.config (ou, no nosso caso, os arquivos application.config, que contêm o nó appsettings).

Uma maneira que eu ter pensado sobre é manter as configurações de aplicativos na tabela de banco de dados que tem um sqlcachedependancy. Isso significa que:

  • Toda vez que uma configuração é alterada no banco de dados, o cache é invalidado, e as configurações são recuperados novamente, atualizando assim a aplicação em tempo real sem a necessidade de arquivos alterar e reiniciar o aplicativo inteiro.
  • Podemos criar uma ferramenta personalizada que nos permite alterar as configurações.

Os contras a meu ver são de que isso pode causar problemas de lógica graves em que, se você tem algo que os controlos uma AppSetting no início de um processo, e, em seguida, muda a meio, você pode acabar inadvertidamente alterar o processo fluir, como a exigência de uma reinicialização do aplicativo completo é negada.

Existe uma maneira de contornar isso?

Existe uma maneira melhor de gerenciar appsettings, de modo que você pode alterá-los em tempo real remotamente para um, vários ou todos os servidores de uma só vez?

Foi útil?

Solução

Eu acho que você acertou os dois jogadores importantes:

  • ou você tem acesso ao sistema de arquivos e você colocar todas as suas configurações em uma infinidade de ficheiros.config * lá

OR:

  • você não tem acesso (ou apenas um acesso muito limitado) para o sistema de arquivos do servidor e, portanto, você está provavelmente melhor colocar as definições de configuração e preferências do usuário em um banco de dados, basicamente, deixando apenas a seqüência de conexão no arquivo de configuração no disco

Ambas as abordagens têm seus prós e contras. Eu tenho tentado por um longo tempo para encontrar um caminho para uma seção de configuração de um campo de banco de dados "materializar", para que eu pudesse basicamente só usar o XML de configuração, mas armazenado em um campo de banco de dados. Infelizmente, todo o sistema de configuração .NET 2.0 é muito "bloqueado" e só apenas assume dados virão de arquivos - não há nenhuma maneira de plug-in, por exemplo um provedor de banco de dados para permitir que o sistema de configuração para ler o seu conteúdo a partir de um campo de banco de dados :-( realmente muito ruim!

A única outra abordagem que eu vi é um "ConfigurationService" no StockTrader 2.0 aplicativo de exemplo fornecido pela Microsoft, mas para minhas necessidades, parecia um exagero e como um realmente complexo, realmente subsistema de peso pesado.

Outras dicas

Você poderia uso SQLite, que será um DB auto-contido em um único arquivo. Dois pássaros com uma pedra?

Se você faz referência a um arquivo de configuração externo que contém appsettings (deixando tudo o mais no app.config normal) então eu acredito que a edição só recarrega essas configurações, não forçar o aplicativo inteiro para reiniciar.

Há uma pergunta semelhante sobre o assunto aqui: arquivos Nested app.config (web.config)

WRT o problema da mudança de valores no meio da execução do programa, eu acho que você poderia localmente cache os valores, e levantar um evento quando eles mudam, permitindo rotinas para chegar a um ponto adequado antes de usar os valores atualizados.

Eu acho que em asp.net que tipo de obter isso de graça porque cada lifecyle página é diferente, então o valor é simplesmente aplicada a novas solicitações de página única, não no meio de uma execução.

Edit: A Informações extra:

As alterações de configuração causar uma reinicialização do domínio de aplicativo

A partir MSDN :

As alterações às definições de configuração no Web.config arquivos indiretamente fazer com que o domínio de aplicação para reiniciar. Esse comportamento ocorre por design. Opcionalmente, você pode usar o atributo configSource para fazer referência a arquivos de configuração externos que não causam uma reinicialização quando uma alteração é feita. Para mais informações, consulte configSource em Geral atributos herdados pela Seção Elements.

Mais informações sobre o ConfigurationManager classe em System.Configuration namespace que poderia ser usado para modificar o arquivos de configuração de programação (ou seja, uma ferramenta personalizada, se o disco relevante permissões de leitura pode ser fornecido). Se se mantiver a usando o construído em classes de configuração, acho que a alteração das configurações externos, que não causa a reinicialização da aplicação, mas elevaria eventos (como propriedade mudou ), que você pode manipular, para garantir o seu código não for travado para fora, alterando as configurações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top