0

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

如果我的代码在 Web 服务器上运行,我可以访问System.Web.Configuration并调用ProvidersHelper以加载由数据确定的适当提供程序web.config

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

在我看来,我可能会编写一个使用反射的包装类(a)确定我是否可以访问内置的System.Web.Configuration.ProvidersHelper,如果不能,(b)提供一个功能等效的接口,它只依赖于我可用的资源在单机模式下。

有没有人以前遇到过这个问题和/或有建议?

4

4 回答 4

3

检查 HttpContext.Current 是否不为空:

if(HttpContext.Current!=null)
   // I'm running on a web server
于 2009-04-13T19:14:51.873 回答
0

您可以创建一个统计 IsWeb 函数,该函数返回 HttpContext.Current 是否为空。

如果它不为空,你就有一个网站,如果它为空,你就没有。

于 2009-04-13T19:15:16.943 回答
0

如果您正在编写一个可以从基于 Web 或非基于 Web 的应用程序访问的模块,那么处理配置的正确方式™,恕我直言,是让客户端代码告诉您您所处的环境。这应该是对客户端代码的轻微影响,并大大降低了代码的复杂性。一种可能的解决方案是让客户端传入一个符合相同接口的对象(尽管快速浏览 MSDN 文档显示没有为 ProvidersHelper 定义接口,因此简单的路线已经过时了)。

于 2009-04-13T19:25:20.133 回答
0

如果您想避免对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());

这种模式称为依赖注入控制反转

于 2009-04-13T19:28:08.987 回答