在Web和非Web应用程序之间共享HttpContext代码
我有一个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应用程序运行,这正是我所寻找的。
如果您引用System.Web程序集,则应该访问HttpContext.Current,它是对当前运行的Web应用程序的HttpContext对象的引用。如果应用程序是普通的Win32应用程序,则此引用应为空指针。因此,在C#中你可以使用: if (HttpContext.Current == null)
或在VB中,你可以使用: If HttpContext.Current Is Nothing Then
但是,我从来没有试图做这样的东西,所以我不能保证结果。让我知道这是否适合你。
感谢, Ç
您可以将System.Web.dll添加到您的应用程序,然后使用HttpContext。问题是在你的应用程序中没有HttpContext,所以你应该使用Web服务或WCF在两个应用程序之间进行通信。
即使应用程序会编译,你也会遇到WinApp中没有HttpContext的问题。
你可以重构web应用程序,而不是HttpContext它会使用服务,例如。 IContextService或一堆服务(ICacheService,ISessionService等)。
该服务有两个实现:一个用于Web应用程序,它将使用HttpContext,另一个用于winapp,该实现将包含确定用户首选项(语言等)的必要逻辑。
如果首选项存储在服务器上,您需要实现某种服务以在您的winapp和服务器之间进行通信。
如果可能,你可以做的最好的事情是完全删除在共享程序集中拥有HTTP上下文的依赖。
例如,您提到的使用HttpContext获取用户首选项的方法可以进行重构,以便将语言改为参数。当您从Web应用程序中调用该方法时,您可以从HttpContext传入语言,并且当您从Windows应用程序调用该方法时,您需要从另一个源传递语言。
我想你可以使用一点点的去耦!
如果您想创建这样一个接口(在你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的解决方案。那么,这些例子仍然适用,只是它的语法略有不同(抱歉,如果这种方式很难读)。
ps,这不是使用IoC容器的方式,您应该使用依赖注入来注入IPrefferedLanguage实现。 – 2010-05-14 17:09:19
您应该使用
Thread.CurrentUICulture
来确定用户的语言。它在WinForms和WebApplication中也受支持。
.NET框架在大多数情况下为您设置它。
您可以在程序/线程启动时进行设置。在Web应用程序中,您可以在Application_BeginRequest的Global.asax.cs中进行设置。
如果你运行的是NUnit GUI工具,那么它不起作用,在这种情况下它不为空:( – 2009-07-03 13:30:19