문제

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가 null이 아닌지 확인하십시오.

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

httpcontext.current가 null인지 여부를 반환하는 Statis isweb 함수를 만들 수 있습니다.

Null이 아닌 경우 웹 사이트가 있습니다. Null이라면 그렇지 않습니다.

웹 기반 또는 비 WEB 기반 애플리케이션에서 액세스 할 수있는 모듈을 작성하는 경우 구성을 처리하기위한 올바른 Way ™는 클라이언트 코드를 갖는 것입니다. 말하다 당신은 당신이 어떤 환경에 빠지고 있는지. 이것은 클라이언트 코드에 대한 사소한 부과가되어야하며, 코드의 복잡성을 크게 줄여야합니다. 가능한 솔루션 중 하나는 클라이언트가 동일한 인터페이스를 준수하는 객체를 통과하도록하는 것입니다 (MSDN 문서를 빠르게 한 눈에 볼 때 ProvidersHelper에 대해 정의 된 인터페이스가 없으므로 쉬운 경로가 나옵니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top