zoukankan      html  css  js  c++  java
  • 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界面

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

  • 相关阅读:
    向上造型
    Service与Activity通信
    adb报错:no permissions (user in plugdev group; are your udev rules wrong?); see [http://developer.android.com/tools/device.html]
    13-AB Test学习
    1-端到端机器学习项目
    12-数据分析框架
    2-电影推荐案例学习
    11-pyecharts使用Tab不完全代码示例
    22-基于Python构建GRPC服务
    akka练习
  • 原文地址:https://www.cnblogs.com/johnny-liu/p/7216631.html
Copyright © 2011-2022 走看看