我有我想在WinForms应用程序和ASP.NET网站中使用的C#代码。每个数据库连接字符串都有所不同,所以我希望能够找出它正在运行的平台并适当地设置连接字符串。有没有简单/推荐的方法来做到这一点?检测C#中运行的平台代码是什么?
这应该在WinForms和ASP.NET上编译,因此请不要使用System.Windows
或System.Web
参考。
我有我想在WinForms应用程序和ASP.NET网站中使用的C#代码。每个数据库连接字符串都有所不同,所以我希望能够找出它正在运行的平台并适当地设置连接字符串。有没有简单/推荐的方法来做到这一点?检测C#中运行的平台代码是什么?
这应该在WinForms和ASP.NET上编译,因此请不要使用System.Windows
或System.Web
参考。
推荐的方法是将连接字符串存储在配置文件中 - App.Config或Web.Config,然后使用ConfigurationManager
进行读取。请参阅MSDN的Storing and Retrieving Connection Strings。
该框架已经为您处理。使用System.Configuration.ConfigurationManager.AppSettings
或ConfigurationManager.ConnectionStrings
来读取您的连接字符串,它们将从App.config WinForms中读取,并从Web.config在ASP.NET中读取。你可以在两个配置文件中添加不同的值。
至于更一般的问题 - 你可以检查System.Web.HttpContext.Current
,如果它不是null
你绝对在ASP.NET内部运行。如果它是null
你是可能不在ASP.NET中,但可能不在请求内。您也可以尝试检查System.Web.HttpRuntime
上的一些属性。
编辑:如果你不希望添加到System.Web.dll的引用,你可以通过反射调用上面:首先调用Type.GetType("System.Web.HttpContex")
并且如果然后返回null
你绝对不是ASP.NET 。如果它返回一个值,则可以继续获取其上的静态属性Current
。
我想使用相同的代码虽然(更容易维护),并且System.Web.HttpContext.Current的引用不会在WinForms应用程序中编译。感谢您的配置文件的建议。 – mikel 2010-12-09 00:50:29
我们做了一些类似于Evgeny建议的检查,看看system.WEb.HttpContext.Current是否存在于我们的自定义dll中,并且效果很好。也许分开的代码,检查它是否是一个不同的项目中的网络/表单应用程序(并在那里添加system.web参考?) – Lareau 2010-12-09 02:28:06
@ miket2e:编辑我的答案建议反射。 – EMP 2010-12-09 04:04:27
让数据库代码检测到它运行的平台似乎是错误的解决方案。无论你选择什么,似乎都会有一种方法来打败它。
相反,我会有我的应用程序的入口点声明它的平台。
enum Platform {
AspNet,
WinForms
}
public class DataConnection {
public DataConnection(Platform platform) {
...
}
}
如何编写一个公共服务层,以便这两个winforms应用程序。和ASP.NET'谈'到同样的事情? – 2010-12-09 00:27:53