这篇算补充一下上一篇 (注:这种方式并不一定好,仅单纯做演示讨论,并不真正推荐)
此类框架(控件)设计的原则在于提高开发效率,隐藏细节。带来的问题是导致分层困难,运行效率较低。
所以,此类框架适用范围是小项目。(较少用户,较短开发周期,但还有不少业务逻辑),甚至,可以用来做sample,给客户做演示用。
同时,随着框架的使用,业务逻辑也是可以被继续提炼的。比如,对于数据准确性/安全性较高的项目,往往需要 有一个用户审核其他用户的输入,可以审批通过,也可以拒绝审批,这样就有一个简单的工作流。(所谓常说的 maker/checker或者dualcontrol)。往往,要让一个初级开发人员了解 maker提交/checker审批/maker重新提交等等操作流程也需要一定时间,且其中有大量细节问题,可能导致项目产生bug(可能是代码考虑不周,也可能是业务上的理解问题)
所以,这里,再对之前提到的组建进行封装,将maker/checker的流程,代码均封装起来。开发者需要做的是:建表,创建配置;
以下展示一系列界面,是一套完整的 增/删/改/查/审批/拒批/修正重提交 界面,可以一边看一遍猜测一下,这样一套sample需要多少代码,多少时间来做。
让我们来看一下实际的代码量:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Business.CommonLogic.CurrentInformation = new Business.CurrentInformation();
Business.CommonLogic.CurrentInformation.SQLConnectionString = DataAccess.GetBranchConnection.GetConnection("Default");
Business.CommonLogic.CurrentInformation.UserName = "System";
Business.Forms.EntityPendingDescription<TB_LAMP_Alert_Switch, TB_LAMP_Alert_Switch_Pending> pd = new NCS.Business.Forms.EntityPendingDescription<TB_LAMP_Alert_Switch, TB_LAMP_Alert_Switch_Pending>()
{
AuthBy_Property = "ApproveBy",
AuthDate_Property = "ApproveDate",
AuthStatus_Property = "Auth_Status",
SubmitBy_Property = "SubmitBy",
SubmitDate_Property = "SubmitDate",
DataStatus_Property = "Status",
AuthStatus_ApproveValue = Auth_Status.Approve,
AuthStatus_PendingValue = Auth_Status.Submit,
AuthStatus_RejectValue = Auth_Status.Reject,
DataStatus_AddValue = Data_Status.Add,
DataStatus_EditValue = Data_Status.Edit,
DataStatus_RemoveValue = Data_Status.Remove,
};//这里是关键,配置类中告诉框架,数据库中用来记录maker/checker的字段,记录状态的字段,值等信息。框架将通过这些信息完成对整个流程的操作,无需额外编写代码
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form f = null;
Form1 fs = new Form1(); //这是一个包含2个按钮的窗口,点maker关闭自身,并设置属性maker=true,点checker直接关闭自身
fs.ShowDialog();
if (fs.Maker)
{
f = new NCS.Business.Forms.frmMaintenance<TB_LAMP_Alert_Switch, TB_LAMP_Alert_Switch_Pending>(
null, "Alert Switch", null, true, true, pd);
}
else
{
f = new NCS.Business.Forms.frmMaintenance_Checker<TB_LAMP_Alert_Switch, TB_LAMP_Alert_Switch_Pending>(
"Alert Switch Checker", null, pd, null);
}
Application.Run(f);
}
}
[UI.DataMapping.HideEnumItem(Auth_Status.System_Auto)]
public enum Auth_Status
{
System_Auto = 0, Submit = 1, Approve = 2, Reject = 3
}
[UI.DataMapping.HideEnumItem(Data_Status.Undefined)]
public enum Data_Status
{
Undefined = 0, Add = 1, Edit = 2, Remove = 3
}
}
这是一个封装的极端例子,实际开发中,不一定能适用,但作为开发者,特别是初学者,不断的提炼自己的项目/实现/代码可以提高自己水平的同时减少将来的工作量,在未来的工作中使用自己之前封装的代码可以发现封装的不足,更容易促进自己的进步。