我正在编写一个C#.NET模块,我想使用提供者模式。
如果我的代码在网络服务器上运行,我可以访问System.Web.Configuration
并可以致电ProvidersHelper
以加载web.config
数据确定的相应提供商。
如果我的代码在独立环境中运行,我将无法访问此类。
在我看来,我可能会编写一个使用反射的包装类来(a)确定我是否可以进入内置System.Web.Configuration.ProvidersHelper
,如果没有,(b)提供一个功能相同的接口,仅依靠我在独立模式下可用的资源。
之前是否有人遇到此问题和/或有建议?
答案 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());