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 源码)

 

以下是运行这个示例的几张截图:

listview界面

login界面

如果您对这个框架感兴趣,可以直接点击 此处 下载框架源码(含示例)。

 

posted @ 2017-07-24 09:51  Johnny.Liu  阅读(1172)  评论(2编辑  收藏  举报