0

C#.NETモジュールを作成していますが、プロバイダーパターンを使用したいと思います。

コードがWebサーバーで実行されている場合、データに基づいて適切なプロバイダーにアクセスしSystem.Web.Configuration、呼び出すことができます。ProvidersHelperweb.config

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

リフレクションを使用して、(a)組み込みに到達できるかどうかを判断しSystem.Web.Configuration.ProvidersHelper、そうでない場合は(b)使用可能なリソースのみに依存する機能的に同等のインターフェイスを提供するラッパークラスを作成する可能性があるようです。スタンドアロンモードで。

以前にこの問題に遭遇したり、提案があったりしたことがありますか?

4

4 に答える 4

3

HttpContext.Current が null でないかどうかを確認します。

if(HttpContext.Current!=null)
   // I'm running on a web server
于 2009-04-13T19:14:51.873 に答える
0

HttpContext.Current が null かどうかを返す statis IsWeb 関数を作成できます。

null でない場合は Web サイトを持っていますが、null の場合はありません。

于 2009-04-13T19:15:16.943 に答える
0

Web ベースまたは非 Web ベースのアプリケーションからアクセスできるモジュールを作成している場合、構成を処理するための Right Way™ は、私見ですが、現在の環境をクライアント コードに通知させることです。これは、クライアント コードへの小さな負担であり、コードの複雑さを大幅に軽減します。考えられる解決策の 1 つは、同じインターフェイスに準拠するオブジェクトをクライアントに渡すことです (ただし、MSDN のドキュメントをざっと見てみると、ProvidersHelper 用に定義されたインターフェイスがないことが示されているため、簡単な方法はありません)。

于 2009-04-13T19:25:20.133 に答える
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 InjectionおよびInversion of Controlと呼ばれます。

于 2009-04-13T19:28:08.987 に答える