UI行为控制器
前两天同事讲解他编写的快速开发模型,他把现实中的不同功能的ASP.NET页面归类,然后根据不同情况实现了相关的模板类;当你需要某此功能时从相关模板派生出来然后重写某些成员很快就能完成(如某行为的Button,或数据编辑Entity来源)。在他演视时并没有看到他编写业务逻辑,于是就好怪地问他是如何处理的;原来在每个类别的页面模板内部都捆绑数据处理功能,他试图在模板类中完成所有数据处理的情况和相关业务逻辑规则。当然这情况我是非常反对的,因为随着业务的变更模板类就会变得臃肿难以维护,最后可能出现更糟的事情!当我提的一大堆面对的问题后确被一个很直接的答案了结了“快速开发”,的确真的很方便对于他描述的例子,我也不能否认!
其实同事的方案是很好的,能使开发人员够遵循一个规则并进行快速开发。只是有一点我是很不认同的就是UI、BLL和DAL捆绑在一起,集中捆绑对代码的修改和维护都是致命的;何况修改和维护的时间往往比开发的时间要长,相应的成本就更高!除非能保证代码能适应所有情况,这显然是不太可能。
为了解决UI和BLL偶合的问题于是想出了UI行为控制器。由控制器描述的接口把UI和BLL相关连接起来;这样可以保证所有开发人员都是基于同一种方式在UI里调用BLL的同时又解决代码的偶合性的问题。
简单数据加载控制过程
/// <summary>
/// 记录加载显示例程
/// </summary>
public class FrmLoad :HFSoft.Controller.Web.PageBase
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
/// <summary>
/// 获取相关行对象
/// </summary>
public override HFSoft.Controller.ILoad Controller_Load
{
get
{
return new Controllers.CategoryLoad();
}
}
/// <summary>
/// 对象加载过程
/// </summary>
/// <param name="data">记录信息</param>
protected override void Controller_Load_Executed(object data)
{
Categories item = (Categories)data;
if(item != null)
{
Response.Write(DBMapping.Categories.CategoryID.Name +":" + item.CategoryName+"<br>");
Response.Write(DBMapping.Categories.CategoryName.Name +":" + item.CategoryName+"<br>");
Response.Write(DBMapping.Categories.Description.Name +":" + item.Description+"<br>");
}
}
/// <summary>
/// 获取需要加载的对象索引值
/// </summary>
public override object Controller_LoadIndex
{
get
{
return 2;
}
}
}
相关行为对象:
public class CategoryLoad:HFSoft.Controller.ILoad
{
#region ILoad 成员
public object DataLoad(object index)
{
// TODO: 添加 CategoryLoad.DataLoad 实现
return DBMapping.Categories.GetByIndex((int)index);
}
#endregion
}
我们可以把基于这种行的页面用同一种行为处理对象;当然现实中并不这么理想,这个时候就可以重写行为成员来设置自己特别的行为处理。
public override HFSoft.Controller.ILoad Controller_Load
通过重写后就可以控制和添加相关的业务规则,这样即能保证不影响其他页面功能的同时也可以获得新功能的扩展。
查询行为控制的应用:
/// <summary>
/// 数据查询例程
/// </summary>
public class FrmQuery : HFSoft.Controller.Web.PageBase
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;
protected System.Web.UI.WebControls.TextBox TextBox1;
protected System.Web.UI.WebControls.LinkButton LinkButton1;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
/// <summary>
/// 获取数据查询行为对象
/// </summary>
protected override HFSoft.Controller.IQuery Controller_Query
{
get
{
return new Controllers.CategoryQuery();
}
}
/// <summary>
/// 数据加载过程
/// </summary>
/// <param name="source">数据源</param>
protected override void Controller_Query_Executed(IList source)
{
DataGrid1.DataSource = source;
DataGrid1.DataBind();
}
/// <summary>
/// 查询行为的相关按钮
/// </summary>
protected override LinkButton Controller_Query_Control
{
get
{
return LinkButton1;
}
}
/// <summary>
/// 查询行为相关的条件信息
/// </summary>
public override object Controller_Query_Filter
{
get
{
return TextBox1.Text;
}
}
}
相关行为对象:
/// <summary>
/// CategoryQuery 的摘要说明。
/// </summary>
public class CategoryQuery:HFSoft.Controller.IQuery
{
public CategoryQuery()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
#region IQuery 成员
public System.Collections.IList DataQuery(object filter)
{
Expression exp = new Expression(DBMapping.Categories);
exp &= DBMapping.Categories.CategoryName.Match(filter.ToString());
return exp.List();
}
#endregion
}
在实现开发过程中UI的行为都是相关固定的(如:add,edit,delete,query等)。
在编写过程制定的行为规则:
/// <summary>
/// 数据添加控制器接口
/// </summary>
public interface IAdd
{
void DataAdd(object data);
}
/// <summary>
/// 数据删除控制器描述接口
/// </summary>
public interface IDelete
{
void DataDlete(object filter);
}
/// <summary>
/// 数据编辑控制器描述接口
/// </summary>
public interface IEdit
{
void DataEdit(object data);
}
/// <summary>
/// 单数据获取控制器描述对象
/// </summary>
public interface ILoad
{
object DataLoad(object index);
}
/// <summary>
/// 数据查询控制器描述接口
/// </summary>
public interface IQuery
{
System.Collections.IList DataQuery(object filter);
}
通过制定行为控制器可以统一规范开发人员编写代码的规则,使代码规范直观方便维护和修改。由于组件还是编写开发中,等完成后再详细总结一下。