Web サーバーで実行しているかどうかを確認するにはどうすればよいですか?
-
09-09-2019 - |
質問
C# .NET モジュールを作成していて、プロバイダー パターンを使用したいと考えています。
コードが Web サーバー上で実行されている場合、次のアクセス権があります。 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であるかどうかを返すWeb機能です。
それがnullではない場合、あなたはそれがnullだ場合、あなたがない、ウェブサイトを持っています。
Web ベースまたは非 Web ベースのアプリケーションからアクセスできるモジュールを作成している場合、構成を処理する正しい方法は、クライアント コードを使用することです。 教えて あなたがどんな環境にいるのか。これはクライアント コードに多少の負担をかけるだけで、コードの複雑さが大幅に軽減されます。考えられる解決策の 1 つは、同じインターフェイスに準拠するオブジェクトをクライアントに渡すことです (ただし、MSDN ドキュメントをざっと見たところ、ProvidersHelper 用に定義されたインターフェイスがないことがわかります。そのため、簡単な方法はありません)。