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

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

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

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

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

有帮助吗?

解决方案

如果您想避免引用 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不为空:

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

您可以创建一个状态Web功能返回HttpContext.Current是否为空。

如果它不是空你有一个网站,如果是零,你不知道。

如果你正在写,可以从非基于网络或者基于Web或应用程序访问的模块,正道™为处理配置,恕我直言,是让客户端代码的告诉你,你在什么样的环境,这应该是在客户端代码未成年人征收,大大降低了代码的复杂性。一个可能的解决办法是在符合相同的接口的对象的客户机通(尽管在MSDN文档快速浏览显示有没有对ProvidersHelper定义的接口,所以简单的路线是出)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top