一个自定义MVP .net框架 AngelFrame
摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngelFrame。这个项目属于前端桌面管理系统的一部分,最终要集成进去。
关键词: .net,Framwork,MVP,框架,c#
1、MVP的具体实现
使用MVP的目的是为了实现类之间的松耦合,其中SCSF提供了完善的实现机制。有时因为项目要求不使用SCSF框架,而抛却MVP带来的代码整洁性、松耦合性实属不该。故编写适合自己使用的,用来实现MVP模式的框架是有必要的。
这里介绍框架AngelFrame及其使用方法,它功能小巧,易于扩展,使用方便。下图是MVP的具体实现、使用的结构图,它包含了Model、View、IView、Presenter以及EventPublication和EventSubscription。
2、AngelFrame的使用示例
下面是一个小例子,它使用AngelFrame框架,按照如下的代码编辑,可以实现界面快速订制。
下面的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;这里的实例化及实例赋值都由AngelFrame管理,采用依赖注入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框架 AngelFrame的更多相关文章
- 自定义MVP .net框架
一个自定义MVP .net框架 AngleFrame 摘要:本篇是本人在完成.net平台下一个项目时,对于MVP框架引发的一些思考,以及开发了一个小型的配置型框架,名字叫作AngleFrame ...
- 如何创建一个自定义jQuery插件
简介 jQuery 库是专为加快 JavaScript 开发速度而设计的.通过简化编写 JavaScript 的方式,减少代码量.使用 jQuery 库时,您可能会发现您经常为一些常用函数重写相同的代 ...
- iOS 10中如何搭建一个语音转文字框架
在2016WWDC大会上,Apple公司介绍了一个很好的语音识别的API,那就是Speech framework.事实上,这个Speech Kit就是Siri用来做语音识别的框架.如今已经有一些可用的 ...
- 编写自定义的JDBC框架与策略模式
本篇根据上一篇利用数据库的几种元数据来仿造Apache公司的开源DbUtils工具类集合来编写自己的JDBC框架.也就是说在本篇中很大程度上的代码都和DbUtils中相似,学完本篇后即更容易了解DbU ...
- Android 玩转IOC,Retfotit源码解析,教你徒手实现自定义的Retrofit框架
CSDN:码小白 原文地址: http://blog.csdn.net/sk719887916/article/details/51957819 前言 Retrofit用法和介绍的文章实在是多的数不清 ...
- Web框架本质及第一个Django实例 Web框架
Web框架本质及第一个Django实例 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...
- 自定义python web框架
-- Bootstrap http://www.bootcss.com/ -- Font Awesome http://fontawesome.io/ -- bxslider http://bxsli ...
- 爬虫之多线程 多进程 自定义异步IO框架
什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...
- netty源码解解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端
本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决 ...
随机推荐
- g++ 4.4.7 template 没问题,前面应该程序问题!!
- Delegate(代理)异常:该委托必须有一个目标
转自 Delegate(代理)异常:该委托必须有一个目标 在代理调用BeginInvoke(new AsyncCallback(callBack), null);时,会抛这个异常的原因是该代理变量代理 ...
- python:一个轻松的递归逻辑
#递归 age = 10 def dig(n): global age#函数dig引用全局变量age age += 2 n -= 1 if n != 1:#如果满足条件,则调用本身 dig(n) di ...
- PHP - declare tick
今天看php手册,结构流程控制语句,翻到个没见过的关键字declare(申明的意思).于是稍稍看了下. 大概意思是:定义一段代码.关于他合适执行,怎么执行完全依照他的参数. 反正不知道什么意思.先来一 ...
- shell编程——sed用法之参数详解
sed格式: sed 参数 '正则表达式' 文件名 sed的常见参数有以下几种: 1.-n, --quiet, --silent 取消自动打印模式 不加n默认打印整个文件: [root@localho ...
- Elasticsearch-PHP 搜索操作
搜索操作 好吧,这不叫elasticsearch的不劳而获!让我们来谈谈PHP客户端中的搜索操作. 客户端允许你通过REST API访问所有的查询和公开的参数,尽可能的遵循命名规则.让我们来看一些例子 ...
- 用java实现一个简易编译器2-语法解析
- vim的vim-addons的问题
最近急切想把vim变成IDE,这个过程的毕竟之路就是装插件,vim有自己的插件管理软件装起插件来相当方便,首先安装这个软件: sudo apt-get install vim-addon-manage ...
- 字符串查找 · Implement strStr()
[抄题]: 对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始).如果不存在,则返回 -1. 如果 ...
- activeMQ集群搭建及高可用
三台服务器搭建如下的集群,达到了高可用.也同时达到了负载的目的: /****************************************************************** ...