My.WinformMvc,一个 Winform MVC 框架
缘起
一般在做 WINFORM 开发时,通常都是将很多业务逻辑直接写在 Form 的事件代码里,造成业务逻辑就和界面逻辑紧密耦合在一起。这种情况下,如果业务逻辑稍有变化,涉及的改动量非常大,甚至于整个界面可能都需要重新调整,测试起来也很麻烦。
几年前,给某市城管委做一个瓶装液化气智能监管信息项目,就在这方面吃了一点亏。
因此,我后来花了一点时间,做了一个简单的 WinForm MVC 框架(个人独立开发,与我当时所在的公司无关,也从未在当时的公司用过),设想着以后如果再遇到类似项目,可以直接拿来用。结果做完之后,也没有在后来的实际项目中用到。多少有点遗憾,权当是一次练手吧,也许以后再用到也说不好。所以现在我决定把这个东西开源出来,有需要的人可以拿去用。
代码和用法
我给这个 winform mvc 框架写了一个示例,下面的代码是从示例中摘取出来的一部分源码:
1 using ContactManager.DataMapping; 2 using ContactManager.Filters; 3 using ContactManager.Services; 4 using ContactManager.Utils; 5 using ContactManager.Views.Model; 6 using ContactManager.Views.Utils; 7 using My.WinformMvc; 8 9 namespace ContactManager.Controllers 10 { 11 [MvcController(Constant.ListController)] 12 public class ListController : BaseController 13 { 14 readonly IContactService _contactService; 15 16 public ListController(IContactService contactService, IView view) 17 : base(view) 18 { 19 _contactService = contactService; 20 } 21 22 public override IActionResult DisplayView() 23 { 24 var myContacts = _contactService.GetContacts().ToModel(); 25 return base.DisplayView(myContacts); 26 } 27 28 [RoleBasedAuthorization(Roles = Constant.AdminRoles)] 29 [ConfirmDelete] 30 [NotifyDelete] 31 [WriteResult] 32 public IActionResult Delete(ContactModel model) 33 { 34 Logger.Log("Before ListController.Delete"); 35 _contactService.DeleteContact(model.Id); 36 Logger.Log("After ListController.Delete"); 37 return DisplayView(); 38 } 39 } 40 }
(ListController 源码)
1 using System; 2 using System.Collections.Generic; 3 using System.Windows.Forms; 4 using ContactManager.Utils; 5 using ContactManager.Views.Model; 6 using ContactManager.Views.Utils; 7 using My.WinformMvc; 8 9 namespace ContactManager.Views 10 { 11 [MvcView("ListView")] 12 public partial class ListView : BaseView, IView<List<ContactModel>> 13 { 14 public ListView() 15 { 16 InitializeComponent(); 17 } 18 19 public void BindModel(List<ContactModel> model) 20 { 21 Logger.Log("ListView.BindModel"); 22 contactDataGridView.DataSource = model; 23 } 24 25 private void btClose_Click(object sender, EventArgs e) 26 { 27 Application.Exit(); 28 } 29 30 private void btnDelete_Click(object sender, EventArgs e) 31 { 32 if (contactDataGridView.SelectedRows.Count == 0) 33 { 34 MessageBox.Show("Please select a row first!", "Information"); 35 return; 36 } 37 38 var contact = contactDataGridView.CurrentRow.DataBoundItem as ContactModel; 39 InvokeAction("Delete", contact); 40 } 41 42 private void btnAdd_Click(object sender, EventArgs e) 43 { 44 OpenView(Constant.EditController, new ContactModel{ IsEdit = false }); 45 } 46 47 private void btnUpdate_Click(object sender, EventArgs e) 48 { 49 if (contactDataGridView.SelectedRows.Count == 0) 50 { 51 MessageBox.Show("Please select a row first!", "Information"); 52 return; 53 } 54 var contact = contactDataGridView.CurrentRow.DataBoundItem as ContactModel; 55 contact.IsEdit = true; 56 OpenView(Constant.EditController, contact); 57 } 58 } 59 }
(ListView 源码)
以下是运行这个示例的几张截图:
如果您对这个框架感兴趣,可以直接点击 此处 下载框架源码(含示例)。