自定义MVP .net框架
一个自定义MVP .net框架 AngleFrame
摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngleFrame。这个项目属于前端桌面管理系统的一部分,最终要集成进去。
关键词: .net,Framwork,MVP,框架,c#
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。
自定义MVP .net框架的更多相关文章
- 一个自定义MVP .net框架 AngelFrame
		
摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngelFrame.这个项目属于前端桌面管理系统的一部分,最终要集成进去. 关键 ...
 - 编写自定义的JDBC框架与策略模式
		
本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...
 - Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架
		
CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...
 - 爬虫之多线程 多进程 自定义异步IO框架
		
什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...
 - IntelliJ IDEA 删除自定义的 Maven 框架依赖
		
IntelliJ IDEA 删除自定义的 Maven 框架依赖 IntelliJ Idea中添加Maven Archetype,但是IntelliJ Idea中并没有提供删除的方法. windows中 ...
 - Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
		
目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPersistence_Test编写 1.3.1 XXXMapper.xml详解 1.3.2 ...
 - 【笔记】拉勾Java工程师高薪训练营-第一阶段 开源框架源码解析-模块一 持久层框架涉及实现及MyBatis源码分析-任务一:自定义持久层框架
		
以下笔记是我看完视频之后总结整理的,部分较为基础的知识点也做了补充,如有问题欢迎沟通. 目录 任务一:自定义持久层框架 1.1 JDBC回顾及问题分析 1.2 自定义持久层框架思路分析 1.3 IPe ...
 - Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化
		
前言 接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了. 前面自定义的持久层框架存在的问题 Dao层若使用实现类,会存在代码重复,整个操作的过程模版重复(加载配 ...
 - Mybatis学习之自定义持久层框架(六) 自定义持久层框架:完善CRUD方法并进行测试
		
前言 没想到会等到半年以后才来写这篇文章,我已经不记得当初自己想要在这篇文章中写什么了,还好有一些零散的笔记留着,就对照着上一篇文章及零散的笔记,把内容给补充完吧. 完善CRUD方法 完善Defaul ...
 
随机推荐
- .net  Framework各个版本之间的发展
			
原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET FrameWork,身为一个NET程序员,里面大概的区别自己还 ...
 - vim_编码配置文件_utf8乱码解决
			
1:简化步奏 调整 :vimrc的脚本配置 编辑~/.vimrc文件,(没有的话新建个)加上如下几行: set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb23 ...
 - 建立TextView位置的部分可以点击,不同的颜色
			
String url="注册代表宝藏驱动器,你已经允许成员<服务条款>,请仔细阅读. "; SpannableStringBuilder style = new Spa ...
 - struts2 模型分配问题和延迟加载问题
			
傅型号值问题: 首先须要说明的是:Action在请求到达ActionProxy时已经创建出来了,而且对应的创建了一个值栈. 在拦截器到达之前这个图片已经OK了.Action已经创建.并且压入了值栈vs ...
 - 关于Java的对象、数组、String类的具体用法
			
对象的行为: 1.内存分配(栈和堆的区别) 栈:保存局部变量的值(用来保存基本数据类型的值:保存类的实例的引用) 对:用来存放动态产生的数据,比如new出来的对象 2.调用方法 方法返回一个值.方法不 ...
 - Asp.net MVC + EF + Spring.Net 项目实践(三)
			
这一篇要整合Model层和Repository层,提供一个统一的操作entity的接口层,代码下载地址(博客园上传不了10M以上的文件,所以用了百度):http://pan.baidu.com/s/1 ...
 - 换行符以及for循环的优化
			
string str = ""; for (int i = 0; i < _errlistCusEmailInfo.Count; i++) ...
 - MonkeyRunner于Windows在下面Eclipse开发环境的搭建步骤(并解决在线Jython配置错误的问题)
			
网上有一shangdong_chu网友写了一篇文章介绍了如何Eclipse构造MonkeyRunner,他做了叙述一个很好的说明.但我对我的环境试验后会见Jython解析错误的问题,和制品缺少Pyde ...
 - pyqt学习总结
			
一.学习来由: 近期一段时间,应朋友的须要,完毕一款抓取软件.一般而言,python是我比較熟悉的语言,又有丰富的抓取和解析模块,所以果断选择之. 而这远远不是重点,后台程序在工作做常常写,所以比較熟 ...
 - OC的构造方法与分类知识点总结
			
OC语言构造方法: 用来初始化对象的方法,对象方法,以减号开头 为了让对象创建出来,成员变量就会有一些固定的值 重写构造方法的注意点: 先调用父类的构造方法([super init]) 再进行子类内部 ...