如何判断我是否在网络服务器下运行?

时间:2009-04-13 19:02:10

标签: .net iis design-patterns provider

我正在编写一个C#.NET模块,我想使用提供者模式。

如果我的代码在网络服务器上运行,我可以访问System.Web.Configuration并可以致电ProvidersHelper以加载web.config数据确定的相应提供商。

如果我的代码在独立环境中运行,我将无法访问此类。

在我看来,我可能会编写一个使用反射的包装类来(a)确定我是否可以进入内置System.Web.Configuration.ProvidersHelper,如果没有,(b)提供一个功能相同的接口,仅依靠我在独立模式下可用的资源。

之前是否有人遇到此问题和/或有建议?

4 个答案:

答案 0 :(得分:3)

检查HttpContext.Current是否为空:

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

答案 1 :(得分:0)

您可以创建一个状态Is Web函数,它返回HttpContext.Current是否为空。

如果它不是null你有一​​个网站,如果它是null,你没有。

答案 2 :(得分:0)

如果您正在编写可以从基于Web或非基于Web的应用程序访问的模块,则处理配置的Right Way™(恕我直言)将使客户端代码告知你所处的环境。这应该是客户端代码的一个小问题,并大大降低代码的复杂性。一种可能的解决方案是让客户端传入符合相同接口的对象(尽管快速浏览一下MSDN文档显示没有为ProvidersHelper定义的接口,因此简单的路由就出来了。)

答案 3 :(得分:0)

如果您想避免System.Web程序集上的引用,您必须创建一个接口,该接口公开您感兴趣的信息,并让您的消费者根据需要提供此接口的实现者: / p>

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

此模式称为Dependency InjectionInversion of Control