Как определить, запущен ли я под веб-сервером или нет? - PullRequest
0 голосов
/ 13 апреля 2009

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 13 апреля 2009

Проверьте, не является ли HttpContext.Current не нулевым:

if(HttpContext.Current!=null)
   // I'm running on a web server
0 голосов
/ 13 апреля 2009

Если вы хотите избежать ссылки на сборку 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());

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

0 голосов
/ 13 апреля 2009

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

0 голосов
/ 13 апреля 2009

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

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

...