如果您想避免对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());
这种模式称为依赖注入和控制反转。