昨天突然脑洞大开,觉得WinForm客户端也可以做成MVC!想到就做!于是把以前做的一个WinForm工程拉出来,选了角色权限模块先试个水。
第一步:调整项目结构,调整后结构如下图:
第二步:拆分逻辑
原来整个窗体类里面包含了很多业务逻辑,这部分不用说,直接拆分到Controller里面,还有工具栏点击事件的处理逻辑,也同样分离出来放到Controller里面。拆分之后,窗体类就变成了一个纯粹的View了。至于Model,就是拖进一个叫Model的文件夹里面就好了。
第三步:处理命名空间变化带来的一系列问题。大概花了两小时,部分重构完成,程序运行正常!
总结:重构后逻辑更加清晰,任务更容易分解,也更容易进行单元测试。这个思路个人认为值得推广。
部分代码:
Manager:
using System;
using System.Collections.Generic;
using System.Linq;
using DevExpress.XtraBars;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraTreeList;
using Insight.WS.Client.Base.Role.Controller;
using Insight.WS.Client.Base.Role.Model;
using Insight.WS.Client.Common;
namespace Insight.WS.Client.Base.Role.View
{
public partial class Manager : MdiBase
{
#region 变量声明
public static List<RoleInfo> Roles;
public static RoleInfo Role;
private bool First = true;
#endregion
#region 构造函数
public Manager()
{
InitializeComponent();
// 注册事件
gdvRole.FocusedRowObjectChanged += gdvRole_FocusedRowObjectChanged;
treMember.CustomDrawNodeImages += CustomDrawNodeImages;
treModule.CustomDrawNodeImages += DrawNodeImages;
treAction.CustomDrawNodeImages += DrawNodeImages;
treData.CustomDrawNodeImages += DrawNodeImages;
}
#endregion
#region 界面事件处理
/// <summary>
/// 窗体加载时初始化控件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RoleManage_Load(object sender, EventArgs e)
{
InitToolBar();
Roles = new List<RoleInfo>();
Role = new RoleInfo();
// 初始化角色列表
grdRole.DataSource = Roles;
Format.GridFormat(gdvRole);
// 初始化角色成员
treMember.SelectImageList = imgMember;
treMember.DataSource = R