Como saber se eu estou correndo em um servidor web ou não?
-
09-09-2019 - |
Pergunta
Eu estou escrevendo um C # .NET módulo e gostaria de usar o padrão de provedor.
Se o meu código está sendo executado em um servidor web, eu tenho acesso a System.Web.Configuration
e pode chamar ProvidersHelper
para carregar um provedor apropriado, conforme determinado pelos dados web.config
.
Se o meu código está sendo executado em um ambiente autônomo, não vou ter acesso a essa classe.
Parece-me que eu poderia escrever uma classe wrapper que usa reflexão para (a) determinar se eu posso chegar ao construída em System.Web.Configuration.ProvidersHelper
, e se não, (b) fornecer uma interface funcionalmente equivalente que contar apenas com o recursos que tenho disponível no modo stand-alone.
Tem alguém aí se deparar com este problema antes e / ou tem sugestões?
Solução
Se você quiser evitar a referência na System.Web
montagem, você terá que criar uma interface que expõe a informação que você está interessado e obter seus consumidores para fornecer implementadores desta interface, conforme apropriado:
// Core assembly, doesn't reference System.Web
public class ThisUsesProviders {
public ThisUsesProviders(IProviderProvider pp) { ... }
}
public interface IProviderProvider {
SpecialProvider InstantiateSpecialProvider(/* custom arguments */);
}
// Helper assembly, references System.Web
public class DefaultProviderProvider : IProviderProvider
{
SpecialProvider InstantiateSpecialProvider(/* custom arguments */)
{
// call ProvidersHelper
}
}
// standalone consumer:
var thing = new ThisUsesProvider(new NonStandardProvider());
// ASP.NET:
var thing = new ThisUsesProvider(new DefaultProviderProvider());
Este padrão é chamado Dependency Injection e Inversão de Controle .
Outras dicas
Verifique se HttpContext.Current não é nulo:
if(HttpContext.Current!=null)
// I'm running on a web server
Você pode criar uma função Web estática que retorna ou não HttpContext.Current é nulo.
Se não for nulo você tem um site, se é nulo, você não.
Se você estiver escrevendo um módulo que pode ser acessado a partir de qualquer aplicações não baseadas em web baseado na web ou, o caminho certo ™ para lidar com a configuração, IMHO, é ter o código do cliente dizer o que o ambiente em que está. Esta deve ser uma imposição menor em código de cliente e reduzir significativamente a complexidade de seu código. Uma possível solução seria ter o passe cliente em um objeto que está em conformidade com a mesma interface (embora um rápido olhar para os docs mostra MSDN não há uma interface definida para ProvidersHelper, então o caminho mais fácil é para fora).