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?

Foi útil?

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).

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