今天我发布了一个小的asp.net beta网络应用程序,允许内部员工修改一些产品信息.我们开始遇到用户覆盖彼此产品信息的问题......即使每个工作人员正在编辑一个完全不同的行(产品).
经过一些谷歌搜索,我想我知道发生了什么,它与静态变量的使用有关,下面是一个快速粗略的问题示例:
// EditProductGroup.aspx.cs
public partial class EditProductGroup : System.Web.UI.Page
{
private static int _groupId = 0;
protected void Page_Load(object sender, EventArgs e)
{
_groupId = Convert.ToInt16(Request.QueryString["GroupID"]);
// get existing ProductGroup information from database using
//_groupId to find the row and populate textboxes
}
private void saveProductGroupData()
{
// when user hits 'save changes' button, update row
//where the primary key column 'ProductGroupID' matches _groupId in the table
}
}
Run Code Online (Sandbox Code Playgroud)
因此,根据我的研究,一个静态变量实际上存在于整个应用程序中,这意味着如果多个用户正在使用该应用程序,他们将有效地读取"_groupId"的相同"值",并且在某些情况下实际设置它导致页面的另一个用户"实例"将数据保存到错误的行(ProductGroupId).
我的意图是静态变量与其他用户隔离,并且不应该是 - 每个用户都有自己的页面实例,因此他们自己的'_groupId'变量实例.
幸运的是,这一切都发生在dev/staging数据库而不是live db上.我不确定是否只需要删除'static'关键字来停止每个人设置/读取的变量.
有什么想法吗?谢谢
我有一个使用一些配置设置的扩展方法.我已经宣布这些为static.
public static class Extensions
{
static string _mailServer = ConfigurationManager.AppSettings["MailServer"];
// ... etc
public static void SendEmailConfirmation(this IOrder order) { }
}
Run Code Online (Sandbox Code Playgroud)
我只是想检查一下这是否符合我的意图,因为我并不是100%肯定.我的想法是,我不想继续阅读这些值,我希望它们能够被读取一次,并在Web应用程序的生命周期中进行缓存.这会发生什么?谢谢
解决方法:
我已经声明了一个类级别的公共静态变量,并在ASP.NET 3.5的环境中使用值0初始化.在加载事件I中,该变量的增量为1
问题:
Postback,我得到该变量的最新值.一个变量声明为STATIC,没有被页面刷新和Postback?你能帮忙吗?
我在这里看到静态类和静态函数是坏的,因为它们占用了大量内存.
我将它用于许多需要与数据库等交互的东西.
静态本地化类的一部分示例,即GetResources
public static class SFLocalization
{
public static string GetResources(string key)
{
string CurrentLanguage = System.Threading.Thread.CurrentThread.CurrentUICulture.ToString();
if (MemoryCache.Default["Resources_" + key] == null)
{
string x
using (Db _db = new Db())
{
MemoryCache.Default["Resources_" + key] = _db.Languages.First(l => l.Key == key && l.LanguageCode == CurrentThread).Value;
}
}
return MemoryCache.Default["Resources_" + key];
}
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中,控制器等..我写这个来获取翻译的值
@SFLocalization.GetResources("NewsletterBoxTitle")
Run Code Online (Sandbox Code Playgroud)
1.)那些情况下的静态课真的那么糟糕吗?
2.)替代方案是什么?也许依赖注入(ninject等..)?? (我在书中看到它Apress - Pro Asp.net Mvc 4