2009-04-13 5 views
0

私はC#.NETモジュールを作成しています。プロバイダパターンを使用したいと思います。私はWebサーバーで動作しているかどうかを確認する方法は?

私のコードがWebサーバー上で実行されている場合、私はSystem.Web.Configurationにアクセスでき、ProvidersHelperを呼び出してweb.configデータで決定された適切なプロバイダーをロードできます。

私のコードがスタンドアロン環境で実行されている場合、私はこのクラスにアクセスすることはできません。

私は、(a)System.Web.Configuration.ProvidersHelperに組み込まれているかどうかを判断するためにリフレクションを使用するラッパークラスを記述することができます。そうでない場合は、(b)スタンドアロンモードで利用できるリソース

この問題を遭遇したことがある人はいませんか?

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

答えて

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()); 

このパターンはDependency InjectionInversion of Controlと呼ばれます。

+0

Davidに感謝します。私はこれがちょうど私が探しているものだと思う! - SL。 –

3

チェック。

ヌルでない場合はウェブサイトを持っていますが、ヌルならウェブサイトはありません。

+0

残念ながら、スタンドアロンモードで実行している場合はSystem.Webにアクセスできないため、そのコードをコンパイルできません。 MSがProvidersHelperを非Webクラスに入れた場合、私の問題は解決しません。 –

+0

プロジェクトにSystem.Webへの参照がある(またはコンパイルされない)場合、System.Webにアクセスする必要があります。 – Powerlord

+0

R.Bemroseに対応して、このコードは2つの異なるアセンブリで使用され、そのうちの1つだけがWebサーバーです。 1つのプロジェクトはSystem.Webへの参照を持ち、もう1つはSystem.Webへの参照を持ちますが、他のプロジェクトはこの依存関係を必要としません。 –

0

あなたはHttpContext.Currentがnullであるかどうかを返しますSTATISのIsWeb関数を作成することができますHttpContext.Currentがnullでないかどうかを確認するために

0

設定を処理するために、ウェブベースまたは非Webベースのいずれかのアプリケーション、右ウェイ™からアクセスできるモジュールを書いている場合は、私見、クライアントコードがあなた何を伝えることですこれは、クライアントコードのマイナーな面倒であり、コードの複雑さを大幅に軽減するはずです。可能な解決策の1つは、クライアントが同じインターフェイスに準拠したオブジェクトを渡すことです(ただし、MSDNのドキュメントでは、ProvidersHelperのインターフェイスが定義されていないため、簡単なルートが示されています)。

+0

はい、それはマイクロソフトに " System.Configuration内のProvidersHelper(または少なくともそのI/F)? "おそらく、彼らはいつかすぐにそこに移動するだろう。 –

関連する問題