2008-11-13 116 views
2

我有一個VB.NET模塊,它從資源文件讀取以正確的語言顯示文本。這是我的問題 - 這個代碼是在Web應用程序和非Web應用程序之間共享的,在Web應用程序中,我使用System.Web.HttpContext來確定用戶的首選語言,但是現在,我的Windows應用程序甚至不會編譯,因爲它說HttpContext沒有定義(我已經嘗試添加一個導入的完整名稱空間 - 沒有骰子)。在Web和非Web應用程序之間共享HttpContext代碼

如果我不能解決它,我會喜歡使用某種try/catch塊,但這並不會改變Windows應用程序不會在其中引用HttpContext進行編譯。如果不將這段代碼移入一個新文件並僅將其包含在Web應用程序中(我不擁有該應用程序,所以我寧願不處理這些影響),是否有另一個選擇需要處理?

如果沒有意義,請讓我知道,我會盡我所能來澄清。

解決方案:我剛剛添加了一個引用System.Web,它允許我的應用程序編譯。我還在「如果HttpContext.Current isnot Nothing Then ... End If」塊中包含了HttpContext引用,這會導致它跳過代碼,如果它不作爲Web應用程序運行,這正是我所尋找的。

回答

3

如果您引用System.Web程序集,則應該訪問HttpContext.Current,它是對當前運行的Web應用程序的HttpContext對象的引用。如果應用程序是普通的Win32應用程序,則此引用應爲空指針。因此,在C#中你可以使用: if (HttpContext.Current == null) 或在VB中,你可以使用: If HttpContext.Current Is Nothing Then

但是,我從來沒有試圖做這樣的東西,所以我不能保證結果。讓我知道這是否適合你。

感謝, Ç

+0

如果你運行的是NUnit GUI工具,那麼它不起作用,在這種情況下它不爲空:( – 2009-07-03 13:30:19

0

您可以將System.Web.dll添加到您的應用程序,然後使用HttpContext。問題是在你的應用程序中沒有HttpContext,所以你應該使用Web服務或WCF在兩個應用程序之間進行通信。

1

即使應用程序會編譯,你也會遇到WinApp中沒有HttpContext的問題。

你可以重構web應用程序,而不是HttpContext它會使用服務,例如。 IContextService或一堆服務(ICacheService,ISessionService等)。

該服務有兩個實現:一個用於Web應用程序,它將使用HttpContext,另一個用於winapp,該實現將包含確定用戶首選項(語言等)的必要邏輯。

如果首選項存儲在服務器上,您需要實現某種服務以在您的winapp和服務器之間進行通信。

0

如果可能,你可以做的最好的事情是完全刪除在共享程序集中擁有HTTP上下文的依賴。

例如,您提到的使用HttpContext獲取用戶首選項的方法可以進行重構,以便將語言改爲參數。當您從Web應用程序中調用該方法時,您可以從HttpContext傳入語言,並且當您從Windows應用程序調用該方法時,您需要從另一個源傳遞語言。

1

我想你可以使用一點點的去耦!

如果您想創建這樣一個接口(在你BLL例如層)

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

和you'de創建兩種實現方式:

在你的網站項目:

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 
    } 
} 

此後,您使用Inversion of Control(Unity,StructureMap,MicroKernel)在您的webconfig中配置應該使用WebPeferredLanguage的實例,並且WinformsPeferredLanguage的單例實例應該返回到您的winforms中。

在您的代碼中,無論何時您需要知道該語言,只需向IoC容器詢問IPreferredLanguage的正確實現,它就會返回您已配置的類型的對象。

所以在您的BLL,你可以程序(例如):

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

寫在這之後,我看到你想要一個VB.NET的解決方案。那麼,這些例子仍然適用,只是它的語法略有不同(抱歉,如果這種方式很難讀)。

+0

ps,這不是使用IoC容器的方式,您應該使用依賴注入來注入IPrefferedLanguage實現。 – 2010-05-14 17:09:19

0

您應該使用

Thread.CurrentUICulture 

來確定用戶的語言。它在WinForms和WebApplication中也受支持。

.NET框架在大多數情況下爲您設置它。

您可以在程序/線程啓動時進行設置。在Web應用程序中,您可以在Application_BeginRequest的Global.asax.cs中進行設置。

相關問題