我最近取得了WCF Windows服务的所有权,该服务大量使用以下静态Utility类来检索查找数据:
public static class Utility
{
//begin code that causes increased memory consumption
private static Dictionary<string, ErrorData> _errorData;
internal static Dictionary<string, ErrorData> ErrorData
{
get
{
if (_errorData == null)
{
_errorData = GetErrorData();
}
return _errorData;
}
}
//end code that causes increased memory consumption
/// GetErrorData method to get error messages from error xml
/// </summary>
/// <returns>Dictionary of Error messages value for different fields.</returns>
internal static Dictionary<string, ErrorData> GetErrorData()
{
Dictionary<string, ErrorData> data = null;
XmlDocument …Run Code Online (Sandbox Code Playgroud) 我正在研究一种问卷类型的应用程序,其中问题存储在数据库中.因此,我在每个Page.OnLoad上动态创建我的控件.这就像一个魅力,并且在回发之间保持ViewState,因为我确保我的动态控件始终具有相同的生成Control.ID.
除了动态填充问题的用户控件之外,我的问卷页面还包含一个"状态"部分(也由用户控件封装),表示问卷的状态(选项为"完成","已启动"或"在进展').如果用户更改问卷状态(即从"进行中"更改为"完成"),我需要回发到服务器,因为问卷的动态部分的内容取决于所选状态.
无论状态如何,一些问题始终存在,而其他问题可能根本不存在于所选状态.关键是,当状态发生变化时,我必须回发到页面并呈现正确的问题集.此外,我需要为那些"始终可用"的问题保留任何用户输入的值.
但是,由于ASP.NET中的页面生命周期,"状态"用户控件的OnLoad(包含从DB加载正确问题所需的正确状态)在"动态问题"用户控件之后才会执行已填充(错误/陈旧值).
为了解决这个问题,我将一个事件从我的"状态"用户控件引发到主页面,以指示状态已更改.然后主页面在"动态问题"用户控件上引发一个事件.因为当这个事件冒出来时,"动态问题"用户控件已经从DB加载了"错误"的问题,它首先调用Controls.Clear.然后,它愉快地使用新状态来查询数据库中的"正确"问题,并在每个问题上执行Control.Add().仅供参考,Control.ID在回发中保持一致.
这个解决方案有效......分类.确定了所选状态的正确问题集; 然而,ViewState因为"永远可用"的问题而迷失了方向.我猜这是因为"动态问题"用户控件在响应状态更改事件时调用Controls.Clear.这必须以某种方式杀死ViewState和我的动态控件之间的关联,即使Control.ID是一致的.
这似乎是一个常见的要求,我几乎可以肯定,有一个更好,更清洁,更不容易出错的方法来实现这一目标.如果它不明显,尽管在去年使用它,我还是无法理解ASP.NET页面的生命周期.任何帮助深表感谢!
我正在设计一个简单的表单创建引擎,用户可以使用各种样板字段类型(Date,Text,DropDown)组合新表单
我决定对域对象(表单字段)进行建模,而不依赖于用于将这些字段呈现给UI的对象.
这是定义域的合同及其某些特化的接口:
namespace Acme.Core.Domain{
public interface IFormField
{
bool Visible { get; set; }
string Key { get; set; }
event EventHandler<FieldVisibilityChangedEventArgs> VisibilityChanged;
FieldType Type{get;}
void Validate(IEnumerable<ValidationError> errors);
int DataId {get;set;}
}
public interface IDropDownField:IFormField{
IDictionary<string, string> Items { get; set; }
KeyValuePair<string, string> SelectedValue { get; set; }
}
public interface IDateField:IFormField{
DateTime? SelectedDate{get;set}
}
}
Run Code Online (Sandbox Code Playgroud)
对于UI方面,我构建了一个并行类型层次结构.这使得与数据验证相关的业务规则的域对象与UI关注点分开,即如何呈现给定字段(MVC HtmlHelper vs WebForm WebControl):
namespace Acme.UI{
public interface IControl
{
//parallel to IFormField
bool Visible { get; set; }
string ID …Run Code Online (Sandbox Code Playgroud) asp.net ×1
debugging ×1
dynamic ×1
events ×1
inheritance ×1
memory-leaks ×1
oop ×1
static ×1
viewstate ×1
wcf ×1