一个自定义MVP .net框架 AngleFrame

 

摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngleFrame。这个项目属于前端桌面管理系统的一部分,最终要集成进去。

关键词:      .net,Framwork,MVP,框架,c#

前提:       当前有很多成熟的.net Plugin Framework,如MEF、SCSF、Sharpdevelop和OSGi.net等,它们在功能上各有特色。
需求:         1、开发的项目或者说模块属于一个大系统的一部分,它需要最终集成于大系统中,比如一个大系统的用户管理功能模块。
                  2、大系统采用的框架.net Plugin Framework并不确定,有可能是SCSF,也有可能是MEF。因此此模块不推荐使用任何大型框架(代码、实例化过程不可控)。
                  3、然而不采用任何的框架会导致,写出来的看起来很混乱,界面与逻辑杂堆在一起,smelly,与我们的审美情调格格不入。
说明:          这时一个适用的框架可以帮大忙。
                  只需在项目中引用Framework.dll、Microsoft.Practices.CompositeUI.dll、Microsoft.Practices.ObjectBuilder.dll,就可以在项目中迅速部署MVP模式,发布并且订制事件,从而彻底实现解耦。
                  在后期集成到大系统中的过程中,使用也极为方便。
 

1、MVP的具体实现

使用MVP的目的是为了实现类之间的松耦合,其中SCSF提供了完善的实现机制。有时因为项目要求不使用SCSF框架,而抛却MVP带来的代码整洁性、松耦合性实属不该。故编写适合自己使用的,用来实现MVP模式的框架是有必要的。

这里介绍框架AngleFrame及其使用方法,它功能小巧,易于扩展,使用方便。下图是MVP的具体实现、使用的结构图,它包含了Model、View、IView、Presenter以及EventPublication和EventSubscription。

2、AngelFrame的使用示例

下面是一个小例子,它使用AngleFrame框架,按照如下的代码编辑,可以实现界面快速订制。

​下面的Form1是我们将要实现的主界面。它分成左右两区,分别命名为UC1,UC2。其中UC1又分成左右两区,其中右区命名为UC3。点击UC1上的按钮,可以弹出一个对话框。在松耦合的情况下,UC1、UC2、UC3的实例均可被灵活替换成其它实例,只要它们实现相同的接口IUC1、IUC2、IUC3即可。

2.1   Form1的实现代码片段

1
2
3
4
5
6
public interface IForm1
{
        void ShowDialog();
        IUC1 UC1 { set; }
        IUC2 UC2 { set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public partial class Form1 : Form, IForm1
{
        private IUC1 _uc1;
        public IUC1 UC1
        {
            set
            {
                _uc1 = value;
                ((Control)_uc1).Dock = DockStyle.Fill;
                panelEx1.Controls.Add((Control)_uc1);
            }
        }
 
        private IUC2 _uc2;
        public IUC2 UC2
        {
            set
            {
                _uc2 = value;
                ((Control)_uc2).Dock = DockStyle.Fill;
                panelEx2.Controls.Add((Control)_uc2);
            }
        }
 
        public new void ShowDialog()
        {
            base.ShowDialog();
            // MessageBox.Show("hello , i am view1.form1 !");
        }
}

代码说明:在panelEx1上添加UC1,在panelEx2上添加UC2;这里的实例化及实例赋值都由AngleFrame管理,采用依赖注入IOC设计模式。

2.2   UC1的实现代码片段

1
2
3
4
5
6
7
public interface IUC1
{
        void ShowDialog1();
        IUC3 UC3 { set; }
        [EventPublication("U", PublicationScope.Global)]
        event EventHandler AfterClickButton;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public partial class UC1 : UserControl, IUC1
{
        private IUC3 _uc3;
        public IUC3 UC3
        {
            set
            {
                  _uc3 = value;
                  ((Control)_uc3).Dock = DockStyle.Fill;
                  panelEx1.Controls.Add((Control)_uc3);
            }
        }
 
        public void ShowDialog1()
        {
            MessageBox.Show(“I am view1.uc1 ! ");
        }
 
        [EventPublication("TestEvent", PublicationScope.Global)]
        public event EventHandler AfterClickButton;
        private void buttonX1_Click(object sender, System.EventArgs e)
        {
            if (AfterClickButton != null)
                AfterClickButton(this, e);
        }
1
2
3
4
5
6
7
8
public class PUC1 : MPresenter<IUC1>
{
       [EventSubscription("TestEvent", ThreadOption.UserInterface)]
        private void OnAfterClickButton(object sender, EventArgs args)
        {
             View.ShowDialog1();
        }
}

代码说明:可以看出在panelEx1上添加UC3,UC1中存在一个事件发生器,它只负责在点击按钮的时候抛出事件。这里,具体的事件捕获代码放在PUC1上,而它可以直接   访问UC1,从而弹出对话框。

2.3  配置文件App.config代码片段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Framework>
       <objects>
         <object name="Form1" assembly="View1.dll" className="View1.Views.Form1">
                <property name="UC1" refObject ="thisIsUC1"/>
                <property name="UC2" refObject ="thisIsUC2"/>
         </object>
 
         <object name="thisIsUC1" assembly="View1.dll" className="View1.Views.UC1">
                <property name="UC3" refObject ="thisIsUC3"/>
         </object>
 
         <object name="thisIsUC2" assembly="View1.dll" className="View1.Views.UC2"/>
         <object name="thisIsUC3" assembly="View3.dll" className="View3.UC3"/>
       
         <object name="thisIsPUC1" assembly="View1.dll" className="View1.Presenters.PUC1">
             <property name="View" refObject ="thisIsUC1"/>
         </object>
       </objects>
       <contexts>
         <context refObject ="thisIsPUC1" />
       </contexts>
  </Framework>

代码说明:这是最重要的一环,所有的依赖注入IOC都是从这里开始的。在这里可以随意的搭配界面,各个小模块可以被灵活的替换,只要它们实现了同一个接口。

               

从上图中可以看出,两者的UC3发生了替换,左侧是一个日历,右侧是一个表盘,只要将上述的App.config代码段中<object name="thisIsUC3" assembly="View3.dll" className="View3.UC3"/>改为<object name="thisIsUC3" assembly="View1.dll" className="View1.Views.UC3"/>即可达到这样的效果。

3、总结

以上就是框架AngelFrame的使用方法、实现效果,AngelFrame虽小,但它提供了这些最基本最实用的开发模式,方便开发者专注于实现业务流程。

关于AngelFrame的具体实现可以参见代码,如需其它功能,可以进行进一步扩展,如有需要代码的可以直接留言或跟本人联系,希望大家交流,完善AngelFrame。

作者:aitanjupt
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
分类: 随笔
标签: .netFramworkMVP框架c#

自定义MVP .net框架的更多相关文章

  1. 一个自定义MVP .net框架 AngelFrame

    摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngelFrame.这个项目属于前端桌面管理系统的一部分,最终要集成进去. 关键 ...

  2. 编写自定义的JDBC框架与策略模式

    本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...

  3. Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架

    CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...

  4. 爬虫之多线程 多进程 自定义异步IO框架

    什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...

  5. IntelliJ IDEA 删除自定义的 Maven 框架依赖

    IntelliJ IDEA 删除自定义的 Maven 框架依赖 IntelliJ Idea中添加Maven Archetype,但是IntelliJ Idea中并没有提供删除的方法. windows中 ...

  6. Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架

    目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPersistence_Test编写 1.3.1 XXXMapper.xml详解 1.3.2 ...

  7. 【笔记】拉勾Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架

    以下笔记是我看完视频之后总结整理的,部分较为基础的知识点也做了补充,如有问题欢迎沟通. 目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPe ...

  8. Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化

    前言 接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了. 前面自定义的持久层框架存在的问题 Dao层若使用实现类,会存在代码重复,整个操作的过程模版重复(加载配 ...

  9. Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试

    前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...

随机推荐

  1. 【SSH 基金会】SSH框架--struts进一步的详细解释(两)

    继上篇博客 既然我们知道了不使用struts给我们带来这么多弊端,那么以下我们来看看struts是怎样封装的.怎么解决我们出现的问题的? 先来说一下struts的基本流程,帮助大家理解以下的代码: S ...

  2. 基于Haar特征Adaboost人脸检测级联分类

    基于Haar特征Adaboost人脸检测级联分类 基于Haar特征Adaboost人脸检测级联分类,称haar分类器. 通过这个算法的名字,我们能够看到这个算法事实上包括了几个关键点:Haar特征.A ...

  3. Oracle查询速度慢的原因总结

    Oracle查询速度慢的原因总结 查询速度慢的原因很多,常见如下几种:1,没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)2,I/O吞吐量小,形成了瓶颈效应.3,没有创建计算列导致 ...

  4. ubuntu 14.04 hadoop eclipse 0配置基本环境

    动人的hadoop第二天.构造hadoop该环境还花了两天时间,在这里写自己配置的过程,我希望能帮助! 我将文中用到的全部资源都分享到了  这里,点开就能下载,不须要一个个的找啦! 当中有<Ha ...

  5. Android手游《》斗地主完整的源代码(支持单机和网络对战)

    Android手游<斗地主>完整的源代码(支持单机和网络对战)下载.一个很不错的源代码. 斗地主掌游是一个独特的国内社会斗地主棋牌游戏,之后玩家可以下载网上斗地主和全世界.掌游斗地主特点: ...

  6. android之【本地通知Notification】

    public class NotificationTest extends Activity { static final int NOTIFICATION_ID = 0x1123; @Overrid ...

  7. 速度 Github

    首先需要了解.git 是版本号的管理工具,为了能够把任意代码托管执照:github 其中一个是. 应用 github 什么不该说的帐户. 那么,申请后,在需求 github 并建立了独特的本地机器上的 ...

  8. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角加入动作

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  9. CSS3+HTML5特效4 - 横向无缝滚动

    先看例子 This is a test 1. This is a test 2. This is a test 3. This is a test 4. This is a test 5. This ...

  10. Linux 时区变化

    1.查看当前的时区 date -R 2.改动当前时区 tzselect 之后会出来一个选项菜单,选择你想要的时区就OK了 3.替换系统时区文件 cp /usr/share/zoneinfo/XXX/Y ...