您的位置:首页 > 其它

【自然框架】之 “表单控件”与“实体类”

2009-06-26 21:13 381 查看
对于简单的添加、修改,也就是没有什么业务逻辑的那种,表单控件的工作步骤是这样的,以添加数据为例。这个不用写什么代码,点点鼠标就可以搞定了。








但是对于复杂的业务逻辑的需求,就不能这么“点点鼠标”就搞定了。这时候我们就需要在流程中间插入了一个步骤——业务处理。这个就需要写代码了,如下图:






先定义一个实体类,然后表单控件可以自动把用户输入的信息赋值给实体类的属性,然后我们就可以进行各种业务处理了,处理完毕之后,表单控件又可以自动接收实体类的属性值,继续后面的步骤。

这样呢,对于简单的没有什么业务逻辑的,就可以简单处理,点点鼠标就ok了。而对于需要做复杂处理的,我们可以在中间插入一步,写一点代码了。有一点加钩子的意思。这样无论是简单的还是复杂的我们都可以处理了。

请注意,我并没有说,加上了一个实体类,我的这个设计OO了,OO是一件任重而道远的事情,也是很难掌握的,至少我是这么感觉的。在这里使用实体类只不过是为了方便处理业务逻辑,并不是为了向OO靠拢,我的原则还是“顺其自然,该用什么就用什么,什么适合就用什么”。而且,我也不能确定这个是不是可以叫做“实体类”,但是这个至少可以叫做“类”。

可能你会感觉这个有点像ORM,确实有一点点像,注意我可没有说我的这个是ORM。人家ORM只管持久化,根本就不管绘制表单、获取用户输入的信息(注意我不是说这样做不对)。

我这个人是很懒的,我就让表单控件做这做那,他多做点事情,我就少写点代码,呵呵。所以我就让表单控件不仅可以绘制表单、提取用户输入的信息、前台的信息验证、后台的“数据类型验证”,还要可以拼接SQL语句、拼接参数化的SQL,还要可以弄出来存储过程的参数,最后呢还要在修改数据的时候可以从数据库里面提取数据绑定控件

当然了有两件事情没有让他做,一个就是和ADO(DbCommand、DbConnection等)打交道,另一个就是做“业务处理”。

表单控件是如何自动给属性赋值的呢?利用了Attribute和反射。前天下午向“横刀天笑”请教了一下Attribute的使用方法,又参考了一下的贴子。终于实现了我的这个想法。只需要在定义实体类的时候给属性多加一个Attribute就可以了。

【定义一个Attribute的代码】

namespace Nature.Common
{
/// <summary>
/// 记录字段ID,用于属性和字段的对应关系。
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public sealed class ColumnIDAttribute : Attribute
{
/// <summary>
/// 字段ID
/// </summary>
private int columnID;

/// <summary>
/// 字段ID,即字段编号
/// </summary>
public int ColumnID
{
get { return columnID; }
set { columnID = value; }
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="value"></param>
public ColumnIDAttribute(int value)
{
columnID = value;
}
}
}


【表单控件里面自动给实体类的属性赋值的代码】

/// <summary>
/// 自动给实体类的属性赋值
/// </summary>
/// <param name="obj">实体类</param>
/// <returns></returns>
public void FillClass(object obj )
{

//获取类里面的属性
PropertyInfo[] infos = obj.GetType().GetProperties(); // typeof(obj).GetProperties();

#region 遍历属性
foreach (PropertyInfo info in infos)
{
//获取属性里的ColumnIDAttribute的值
ColumnIDAttribute columnID = (ColumnIDAttribute)info.GetCustomAttributes(typeof(ColumnIDAttribute), false)[0];

if (dic_BaseCols[columnID.ColumnID] != null)
{
info.SetValue(obj, dic_BaseCols[columnID.ColumnID].ColValue, null); //赋值
}
}
#endregion

}


【表单控件里面获取实体类的属性值的代码】



/// <summary>
/// 获取实体类的属性值
/// </summary>
/// <param name="obj">实体类</param>
/// <returns></returns>
public void ExtractClass(object obj)
{
//获取类里面的属性
PropertyInfo[] infos = obj.GetType().GetProperties(); ;

#region 遍历属性
string tmpValue = "";
foreach (PropertyInfo info in infos)
{
//获取属性里的ColumnIDAttribute的值
ColumnIDAttribute columnID = (ColumnIDAttribute)info.GetCustomAttributes(typeof(ColumnIDAttribute), false)[0];

if (dic_BaseCols[columnID.ColumnID] != null)
{
tmpValue = info.GetValue(obj, null).ToString(); //取值
dic_BaseCols[columnID.ColumnID].ColValue = tmpValue;

//绑定控件
this.SetControlValue(columnID.ColumnID.ToString(), tmpValue);
}
}
#endregion

}


【如何使用的代码】






/**//// <summary>


/// 功能节点的辅助类


/// </summary>


public class MyNote






{




属性#region 属性




节点ID#region 节点ID


private string _FunctionID;






/**//// <summary>


/// 节点ID


/// </summary>


[ColumnID(1000010)]


public string FunctionID






{




get

{ return _FunctionID; }




set

{ _FunctionID = value; }


}


#endregion






权限标志#region 权限标志


private string _PowerMark;






/**//// <summary>


/// 权限标志


/// </summary>


[ColumnID(1000050)]


public string PowerMark






{




get

{ return _PowerMark; }




set

{ _PowerMark = value; }


}


#endregion






父节点ID#region 父节点ID


private string _ParentID;






/**//// <summary>


/// 父节点ID


/// </summary>


[ColumnID(1000020)]


public string ParentID






{




get

{ return _ParentID; }




set

{ _ParentID = value; }


}


#endregion






父节点路径#region 父节点路径


private string _ParentIDPath;






/**//// <summary>


/// 父节点路径


/// </summary>


[ColumnID(1000032)]


public string ParentIDPath






{




get

{ return _ParentIDPath; }




set

{ _ParentIDPath = value; }


}


#endregion






节点级数#region 节点级数


private string _NoteLevel;




/**//// <summary>


/// 节点级数


/// </summary>


[ColumnID(1000060)]


public string NoteLevel






{




get

{ return _NoteLevel; }




set

{ _NoteLevel = value; }


}


#endregion






排序序号#region 排序序号


private string _Sort;




/**//// <summary>


/// 排序序号


/// </summary>


[ColumnID(1000090)]


public string Sort






{




get

{ return _Sort; }




set

{ _Sort = value; }


}


#endregion






网址#region 网址


private string _WebURL;




/**//// <summary>


/// 网址


/// </summary>


[ColumnID(1000100)]


public string WebURL






{




get

{ return _WebURL; }




set

{ _WebURL = value; }


}


#endregion






目标#region 目标


private string _Target;






/**//// <summary>


/// 打开窗口的target


/// </summary>


[ColumnID(1000110)]


public string Target






{




get

{ return _Target; }




set

{ _Target = value; }


}


#endregion




#endregion


}






MyNote myNote = new MyNote();




//获取是要添加子节点,还是兄弟节点


string addNoteKind = Request.QueryString["n"];


if (addNoteKind == "1")


myNote.SetSonNote(dal,this.DataID);


else


myNote.SetBortherNote(dal, this.DataID);




//表单控件接收属性值


Form_Base.ExtractClass(myNote);





不过想一想,这么做了之后,还真是可以换用其他的ORM了,只是不知道对于实体类的定义要不要作修改,因为我没有用过其他的ORM。



总结:

1、 简单的、没有业务逻辑的添加、修改的操作,直接让表单控件全权负责就可以了。
2、 有业务逻辑的,那么就根据需要定义一个实体类,让表单控件自动赋值,然后我们就可以做业务处理(这是就需要写代码了)。最后表单控件会自动接收实体类的属性值。

3、 实体类的定义可以有代码生成器生成。(我的代码生成器暂时没有完成)



===============================



相关贴子:

【自然框架】之鼠标点功能现(一):单表的增删改查(即上次5月23日活动的一个主题)【Demo、源码下载】

【自然框架】之鼠标点功能现(二):表单控件的“应用”—— 代码?只写需要的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐