2

リソース ファイルから読み取り、正しい言語でテキストを表示する VB.NET モジュールを入手しました。ここに私の問題があります - このコードは Web アプリケーションと非 Web アプリケーションの間で共有されます。Web アプリケーションでは System.Web.HttpContext を使用してユーザーの優先言語を判断していますが、Windows アプリはコンパイルさえしません。 、それは HttpContext が定義されていないと言っているからです (私はすでに完全な名前空間のインポートを追加しようとしました - ダイスはありません)。

他の方法で回避できない場合は、ある種の try/catch ブロックを使用したいと思いますが、Windows アプリが HttpContext への参照を使用してコンパイルされないことは変わりません。このコードのチャンクを新しいファイルに移動せずに、Web アプリケーションにのみ含めます (私はそのアプリを所有していないため、それらの影響を扱いたくありません)、これに対処する必要がある別の選択肢はありますか?

意味がわからない場合はお知らせください。明確にするために最善を尽くします。

解決策: System.Web への参照を追加したところ、アプリケーションをコンパイルできるようになりました。また、HttpContext 参照を "If HttpContext.Current isnot Nothing Then...End If" ブロックでラップしました。これにより、Web アプリケーションとして実行されていない場合はコードがスキップされます。これはまさに私が探していたものです。

4

6 に答える 6

3

System.Web アセンブリを参照する場合は、現在実行中の Web アプリの HttpContext オブジェクトへの参照である HttpContext.Current へのアクセス権を付与する必要があります。アプリケーションが通常の Win32 アプリの場合、この参照は null ポインターである必要があります。したがって、C# では次のように使用 if (HttpContext.Current == null) できます: または VB では次のように使用できます。 If HttpContext.Current Is Nothing Then

ただし、この種のことを試したことがないため、結果を保証することはできません。それがうまくいくかどうか教えてください。

ありがとう、C

于 2009-01-02T20:23:03.063 に答える
1

アプリがコンパイルされたとしても、WinApp に HttpContext がないという問題が発生します。

HttpContext の代わりにサービスを使用するように webapp をリファクタリングできます。IContextService または一連のサービス (ICacheService、ISessionService など)。

サービスには 2 つの実装があります。1 つは HttpContext を使用する Web アプリ用で、もう 1 つはユーザー設定 (言語など) を決定するために必要なロジックを実装する winapp 用です。

設定がサーバーに保存されている場合は、winapp とサーバーの間で通信するために何らかのサービスを実装する必要があります。

于 2008-11-13T07:59:04.043 に答える
1

少しデカップリングできると思います!

このようなインターフェイスを作成する場合 (たとえば、BLL レイヤーで)

public interface IPreferredLanguage
{
     String PeferredLanguage { get; set; }
}

そして、2 つの実装を作成します。

あなたのウェブサイトプロジェクトでは:

public class WebPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get
          {
               return // retrieve the language from the http context
          }
          set
          {
               // set the preferred language in the HttpContext
          }
     } 
}

winforms プロジェクトで:

public class WinformsPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get; set; // automatic properties
     } 
}

これ以降、制御の反転(Unity、StructureMap、MicroKernel) を使用して、webconfig で、WebPeferredLanguage のインスタンスを使用し、WinformsPeferredLanguage のシングルトン インスタンスを winform で返すように構成します。

コードで言語を知る必要があるときはいつでも、IoC コンテナーに IPreferredLanguage の正しい実装を要求するだけで、構成した型のオブジェクトが返されます。

だからあなたのbllであなたはプログラムすることができます(例えば):

public String GetEmailMessage()
{
    var currentLanguage = IoC.Resolve<IPreferredLanguage>().PeferredLanguage;
    return Resources[currentLanguage ].EmailMessage;
}

これを書いた後、あなたが VB.NET ソリューションを望んでいたことがわかりました。まあ、例はまだ適用されますが、文法がわずかに異なるだけです (このように読みにくい場合は申し訳ありません)。

于 2008-11-13T09:02:26.507 に答える
0

使用する必要があります

Thread.CurrentUICulture

ユーザー言語を決定します。WinForms と WebApplication でもサポートされています。

ほとんどの場合、.NET フレームワークによって自動的に設定されます。

プログラム/スレッドの開始時に設定できます。Web アプリケーションでは、Application_BeginRequest の Global.asax.cs に設定できます。

于 2014-03-02T08:36:26.293 に答える
0

System.Web.dll をアプリケーションに追加してから、HttpContext を使用できます。問題は、win アプリケーションに HttpContext がないことです。そのため、Web サービスまたは WCF を使用して 2 つのアプリケーション間で通信する必要があります。

于 2008-11-13T07:51:49.877 に答える
0

可能であれば、おそらく最善の方法は、共有アセンブリに HTTP コンテキストを持つことへの依存を完全に削除することです。

たとえば、HttpContext を使用してユーザーの好みを取得するメソッドをリファクタリングして、代わりに言語をパラメーターとして指定することができます。Web アプリケーションからメソッドを呼び出す場合は、HttpContext から言語を渡すことができます。Windows アプリケーションから呼び出す場合は、別のソースから言語を渡す必要があります。

于 2008-11-13T08:11:46.017 に答える