我们在Web和Windows(表单和控制台)应用程序之间有一个在.net中共享的库。当用作Web应用程序时,需要从cookie中读取几个变量。否则,它需要从Windows注册表中读取相同的变量。我似乎无法找到一个好的解决方案,这样就可以为所有环境编译相同的库。具体来说,用于读取cookie的Web库不会包含在Windows应用程序中(从而打破编译),更不用说检测一个环境与另一个环境。有人有解决方案吗?
答案 0 :(得分:3)
如果您在IIS中托管,则可以阅读Environment.GetEnvironmentVariables(" APP_POOL_ID"),然后在变量存在的情况下采取相应措施
答案 1 :(得分:1)
根据您图书馆的架构,此信息应由客户端代码提供。即,您提供了一些抽象层,该层将由客户端代码填写。
我将展示一个我的意思的简单例子。在您的库中,您有一个这样的界面:
public interface ISettingsProvider
{
public string GetSettingA();
public string GetSettingB();
}
然后,需要访问设置的库代码必须依赖于ISettingsProvider
:
public class MyLibraryClient
{
private readonly ISettingsProvider settingsProvider;
public MyLibraryClient(ISettingsProvider settingsProvider)
{
this.settingsProvider = settingsProvider;
}
public void MyAwesomeMethod()
{
var settingA = settingsProvider.GetSettingA();
// do more stuff with your settings
}
}
然后您的客户端代码应该实现ISettingsProvider
:
public class WebSettingsProvider : ISettingsProvider
{
public string GetSettingA()
{
// go get the value from cookies
return Cookies["MyCookie1"];
}
public string GetSettingB()
{
// go get the value from cookies
return Cookies["MyCookie2"];
}
}
存储在注册表中的设置非常类似。
当客户端代码访问您的库时,他们必须立即提供设置提供程序的实例并将其提供给您。
这样你的图书馆对网络或Windows一无所知。你必须保持你的代码更清洁,这是更可测试的。而且您不必依赖System.Web
并最终将这种依赖推向不适用于Web的客户端代码,即Windows应用程序。
我知道你说过你可以做的改变数量有限。我对此的回答是:你不能在没有破蛋的情况下制作一个omlet。这将是最干净的方式来做你想要的,其他一切都有缺点。
答案 2 :(得分:-1)
在Web环境中,您应该HttpContext.Current
。如果从控制台(或WinForms-Application)调用它,则应该为null而不是Context。
要访问此内容,您需要引用Sytem.Web
。添加此引用并从Winforms-Application访问后端时应该没有问题。
示例:
public bool ImInDaWeb() {
return System.Web.HttpContext.Current!=null;
}
即使在Web应用程序中,HttpContext.Current 也可以为空,但是由于您需要这种检测来读/写cookie,您必须在有效请求中检测到这一点(而不是例如,在应用程序启动时)。