Как узнать, работаю ли я под веб-сервером или нет?
-
09-09-2019 - |
Вопрос
Я пишу модуль 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 не определен интерфейс, поэтому простой путь отсутствует).