Как узнать, работаю ли я под веб-сервером или нет?

StackOverflow https://stackoverflow.com/questions/744991

Вопрос

Я пишу модуль C# .NET и хотел бы использовать шаблон поставщика.

Если мой код выполняется на веб-сервере, у меня есть доступ к System.Web.Configuration и могу позвонить ProvidersHelper загрузить соответствующего провайдера, как определено web.config данные.

Если мой код выполняется в автономной среде, у меня не будет доступа к этому классу.

Мне кажется, что я мог бы написать класс-оболочку, который использует отражение, чтобы (а) определить, смогу ли я добраться до встроенного System.Web.Configuration.ProvidersHelper, а если нет, (б) предоставить функционально эквивалентный интерфейс, который будет полагаться только на те ресурсы, которые у меня есть в автономном режиме.

Кто-нибудь сталкивался с этой проблемой раньше и/или имел предложения?

Это было полезно?

Решение

Если вы хотите избежать ссылки на System.Web сборку, вам придется создать интерфейс, который предоставляет интересующую вас информацию, и заставить ваших потребителей предоставить разработчиков этого интерфейса соответствующим образом:

// 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());

Этот шаблон называется Внедрение зависимости и Инверсия контроля.

Другие советы

Проверьте, не имеет ли значение HttpContext.Current значение null:

if(HttpContext.Current!=null)
   // I'm running on a web server

Вы можете создать функцию statis IsWeb, которая возвращает значение HttpContext.Current, равное нулю.

Если оно не равно нулю, у вас есть веб-сайт, если оно равно нулю, то нет.

Если вы пишете модуль, к которому можно получить доступ как из веб-приложений, так и из не-веб-приложений, то правильный способ обработки конфигурации, ИМХО, заключается в наличии клиентского кода. рассказывать вы, в какой среде вы находитесь.Это должно незначительно повлиять на клиентский код и значительно снизить сложность вашего кода.Одним из возможных решений было бы передать клиенту объект, соответствующий тому же интерфейсу (хотя беглый взгляд на документацию MSDN показывает, что для ProvidersHelper не определен интерфейс, поэтому простой путь отсутствует).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top