使用PureMVC实现ASP.NET的MVC结构开发
2008-09-14 16:42
776 查看
source: /article/5168025.html
使用PureMVC实现ASP.NET的MVC结构开发
对PureMVC的认识是从学习Flex开始的,关于它的资料实在是少得可怜,只有官网上的一个PDF,而且写得也不够详细。我以前的一篇文章PureMVC的原理和逻辑提到了,PureMVC只是一个纯框架而已,那么他自然也是支持ASP.NET的了。但是在网上却根本找不到PureMVC在C#方面的应用的资料。有热心的读者看了我先前的文章后,希望我能做个C#的Demo出来。其实,这已经是我计划中的事情了,但由于一直都很忙,直到现在才好不容易挤出点时间写了个ASP.NET的Demo。Demo是我一贯喜欢做的登录实例,我个人觉得,对于Web应用,登录功能是最好的入门实例了。
Demo是使用PureMVC开发的,如果读者对PureMVC还不太了解,建议先看一下官网的Best Pratice,对PureMVC的结构有个大概的了解。接下来我将详细的讲解Demo的实现。
首先是MyFacade类(名字是随便取的),这个类继承父类org.puremvc.csharp.patterns.facade,用于管理整个应用程序的MVC,在MyFacade类中定义了一个方法:
使用单例模式实例化MyFacade类,由于PureMVC使用的是Java的命名规范,所以getInstance方法的首字母是小写的,用它来覆盖父类的同名方法。在PureMVC中,所有的Command,Mediator,Proxy都要注册后才能够使用。
initializeController方法用来初始化Controller,因为Controller负责管理Command,可以在这个方法里面注册需要使用到的Command。因为网页不同于Flex,它是多页面的应用,所以我为每个页面都注册一个单独的Command,用来注册页面中需要用到的其它Command。因为这个Demo只实现了一个功能,所以只在这里注册了一个页面级的DefaultPageCommand。虽然这里也可以注册其它的Command,但是,我建议为每一个页面创建一个页面级的Command类,在这个类里面注册其它页面中需要使用到的Command,这样更方便于管理和分类。
initializeModel方法和initializeModel方法的原理是一样的,只是它注册的是Proxy而已。Proxy用于访问数据模型,存取数据,相当于平时的数据访问层吧。这里我只用到了UserProxy类,用于读取用户的信息。
DefaultPage方法用于启动整个PureMVC框架,一般在页面加载完成的时候调用,可以在Page_Load方法里面调用。它的功能是发出一个通知,并传入页面的引用Page实例。通知发出后,Controller就会执行注册了的与MyFacade.DEFAULTSTARTUP这个名字绑定了的DefaultPageCommand的execute方法。这方法的名字和Struts的Action里面的execute一样,其实PureMVC的Command和Struts的Action是很相似的。下面来看一下DefaultPageCommand的execute方法的内容:
在这里可以统一地注册页面需要使用到的MVC。现在再来看一下LoginMediator类的构造函数
Mediator是用来管理V(View)层的,可以在Mediator里面添加事件或改变视图的表现等操作。我这里是先为登录按钮注册一个登录事件。
Login方法通过传的Page获取用户登录的用户名和密码,然后发出通知DefaultPageCommand.LOGIN,并且传入登录的信息loginVO,执行相应的Command类。Mediator还有一些其它的重要的方法
Mediator也是可以接收通知的,listNotificationInterests方法用来告诉View它所以接收的通知,这样,有方法发出对应的通知后,它就会调用handleNotification来处理
我这里为登录结果的不同通知作出相应的处理。接下来看一下点击了登录按钮后LoginCommand在做些什么事情
在LoginCommand里,使用facade(父类的一个Facade对象)调用retrieveProxy方法取得对应名字的Proxy对象,然后调用Proxy对象的方法来获取需要的数据。下面是Proxy的GetUserInfo方法:
到此,整个Demo的实现就完成了。这些注册,发出通知等等绕来绕去的执行可能一下子很难理清整个过程的思路,其实本人就花了不少的时间才大概的能理清这些复杂的关系(其实它们的耦合度是很低的,但是脑子就是反应不过来)。下面提供这个Demo的源码,这可是网上绝无仅有的PureMVC-C#的Demo哦,喜欢的朋友就下吧,希望大家多多支持本人的博客。真的骄傲在今后的时间里,还会陆续推出一系列的文章和Demo,向各位读者学习和交流。
下面是源码的下载地址:
PureMVCTest.rar
使用PureMVC实现ASP.NET的MVC结构开发
对PureMVC的认识是从学习Flex开始的,关于它的资料实在是少得可怜,只有官网上的一个PDF,而且写得也不够详细。我以前的一篇文章PureMVC的原理和逻辑提到了,PureMVC只是一个纯框架而已,那么他自然也是支持ASP.NET的了。但是在网上却根本找不到PureMVC在C#方面的应用的资料。有热心的读者看了我先前的文章后,希望我能做个C#的Demo出来。其实,这已经是我计划中的事情了,但由于一直都很忙,直到现在才好不容易挤出点时间写了个ASP.NET的Demo。Demo是我一贯喜欢做的登录实例,我个人觉得,对于Web应用,登录功能是最好的入门实例了。
Demo是使用PureMVC开发的,如果读者对PureMVC还不太了解,建议先看一下官网的Best Pratice,对PureMVC的结构有个大概的了解。接下来我将详细的讲解Demo的实现。
首先是MyFacade类(名字是随便取的),这个类继承父类org.puremvc.csharp.patterns.facade,用于管理整个应用程序的MVC,在MyFacade类中定义了一个方法:
Code /// <summary> /// 单例模式实例化对象 /// </summary> /// <returns></returns> new public static MyFacade getInstance() { if (Instance == null) { Instance = new MyFacade(); } return Instance; }
使用单例模式实例化MyFacade类,由于PureMVC使用的是Java的命名规范,所以getInstance方法的首字母是小写的,用它来覆盖父类的同名方法。在PureMVC中,所有的Command,Mediator,Proxy都要注册后才能够使用。
Code /// <summary> /// 初始化Controller,注册需要使用到的Command /// </summary> protected override void initializeController() { base.initializeController(); registerCommand(MyFacade.DEFAULTSTARTUP, typeof(DefaultPageCommand)); }
initializeController方法用来初始化Controller,因为Controller负责管理Command,可以在这个方法里面注册需要使用到的Command。因为网页不同于Flex,它是多页面的应用,所以我为每个页面都注册一个单独的Command,用来注册页面中需要用到的其它Command。因为这个Demo只实现了一个功能,所以只在这里注册了一个页面级的DefaultPageCommand。虽然这里也可以注册其它的Command,但是,我建议为每一个页面创建一个页面级的Command类,在这个类里面注册其它页面中需要使用到的Command,这样更方便于管理和分类。
Code protected override void initializeModel() { base.initializeModel(); registerProxy(new UserProxy()); }
initializeModel方法和initializeModel方法的原理是一样的,只是它注册的是Proxy而已。Proxy用于访问数据模型,存取数据,相当于平时的数据访问层吧。这里我只用到了UserProxy类,用于读取用户的信息。
Code /// <summary> /// 启动页面,注册其它类 /// </summary> /// <param name="page"></param> public void DefaultPage(Page page) { sendNotification(MyFacade.DEFAULTSTARTUP, page); }
DefaultPage方法用于启动整个PureMVC框架,一般在页面加载完成的时候调用,可以在Page_Load方法里面调用。它的功能是发出一个通知,并传入页面的引用Page实例。通知发出后,Controller就会执行注册了的与MyFacade.DEFAULTSTARTUP这个名字绑定了的DefaultPageCommand的execute方法。这方法的名字和Struts的Action里面的execute一样,其实PureMVC的Command和Struts的Action是很相似的。下面来看一下DefaultPageCommand的execute方法的内容:
Code /// <summary> /// 注册页面要使用到的类 /// </summary> /// <param name="notification"></param> public override void execute(INotification notification) { Page page = notification.getBody() as Page; facade.registerCommand(LOGIN, typeof(LoginCommand)); facade.registerMediator(new LoginMediator(page)); }
在这里可以统一地注册页面需要使用到的MVC。现在再来看一下LoginMediator类的构造函数
Code new public static readonly string NAME = "LoginMediator"; /// <summary> /// 为页面控件添加事件,这里只添加登录事件 /// </summary> /// <param name="page"></param> public LoginMediator(Page page) : base(NAME, page) { Button loginButton = (Button)page.FindControl("LoginButton"); loginButton.Click += new EventHandler(Login); }
Mediator是用来管理V(View)层的,可以在Mediator里面添加事件或改变视图的表现等操作。我这里是先为登录按钮注册一个登录事件。
Code /// <summary> /// 登录按钮的单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void Login(object sender, EventArgs e) { TextBox userNameTextBox = (TextBox)MyPage.FindControl("UserNameTextBox"); string userName = userNameTextBox.Text; TextBox passwordTextBox = (TextBox)MyPage.FindControl("PasswordTextBox"); string password = passwordTextBox.Text; LoginVO loginVO = new LoginVO(userName, password); sendNotification(DefaultPageCommand.LOGIN, loginVO); }
Login方法通过传的Page获取用户登录的用户名和密码,然后发出通知DefaultPageCommand.LOGIN,并且传入登录的信息loginVO,执行相应的Command类。Mediator还有一些其它的重要的方法
Code /// <summary> /// 列出该Mediator要接收的通知 /// </summary> /// <returns></returns> public override IList<string> listNotificationInterests() { List<string> list = new List<string>(); list.Add(LoginCommand.LOGIN_SUCCESS); list.Add(LoginCommand.LOGIN_FAILED); list.Add(LoginCommand.USER_NOT_FOUND); return list; }
Mediator也是可以接收通知的,listNotificationInterests方法用来告诉View它所以接收的通知,这样,有方法发出对应的通知后,它就会调用handleNotification来处理
Code /// <summary> /// 对接收到的通知分别进行处理 /// </summary> /// <param name="notification"></param> public override void handleNotification(INotification notification) { switch (notification.getName()) { case "LoginSuccess": MyPage.Session["User"] = notification.getBody(); MyPage.Response.Redirect("Welcome.aspx"); break; case "LoginFailed": Message.Text = "用户名或密码不正确 !"; break; case "UserNotFound": Message.Text = "该用户不存在!"; break; } }
我这里为登录结果的不同通知作出相应的处理。接下来看一下点击了登录按钮后LoginCommand在做些什么事情
Code public override void execute(INotification notification) { base.execute(notification); //获得用户登录的信息 LoginVO loginVO = (LoginVO)notification.getBody(); //获得需要使用到的Proxy UserProxy userProxy = facade.retrieveProxy(UserProxy.NAME) as UserProxy; //通过用户名返回用户的信息 UserInfo userInfo = userProxy.GetUserInfo(loginVO.UserName); //实现用户的登录逻辑 if (userInfo != null) { if (userInfo.Password == loginVO.Password) { //发出登录情况的通知 sendNotification(LOGIN_SUCCESS, userInfo); } else { sendNotification(LOGIN_FAILED); } } else { sendNotification(USER_NOT_FOUND); } }
在LoginCommand里,使用facade(父类的一个Facade对象)调用retrieveProxy方法取得对应名字的Proxy对象,然后调用Proxy对象的方法来获取需要的数据。下面是Proxy的GetUserInfo方法:
Code /// <summary> /// 从数据库中读取用户信息 /// </summary> /// <param name="userName"></param> /// <returns></returns> public UserInfo GetUserInfo(string userName) { UserInfoTableAdapter adapter = new UserInfoTableAdapter(); MyDataSet.UserInfoDataTable dataTable = adapter.GetUserByUserName(userName); UserInfo userInfo = null; if (dataTable.Rows.Count > 0) { userInfo = new UserInfo(); MyDataSet.UserInfoRow row = dataTable[0]; userInfo.UserId = row.UserId; userInfo.UserName = row.UserName; userInfo.Password = row.Password; userInfo.Email = row.Email; } return userInfo; }
到此,整个Demo的实现就完成了。这些注册,发出通知等等绕来绕去的执行可能一下子很难理清整个过程的思路,其实本人就花了不少的时间才大概的能理清这些复杂的关系(其实它们的耦合度是很低的,但是脑子就是反应不过来)。下面提供这个Demo的源码,这可是网上绝无仅有的PureMVC-C#的Demo哦,喜欢的朋友就下吧,希望大家多多支持本人的博客。真的骄傲在今后的时间里,还会陆续推出一系列的文章和Demo,向各位读者学习和交流。
下面是源码的下载地址:
PureMVCTest.rar
相关文章推荐
- 使用PureMVC实现ASP.NET的MVC结构开发
- 使用PureMVC实现ASP.NET的MVC结构开发
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之调整首页显示
- 使用一般处理程序,模拟ASP.NET MVC,开发一个轻量级的学习版MVC框架。
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之创建Viewport(1)
- ASP.NET MVC使用jQuery实现Autocomplete
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序实现继承
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
- ASP.NET MVC 过滤器开发与使用
- asp.net网站MVC开发模式下实现Sitemap(站点导航)的一些经验教训
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(2)
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之数据篇
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之数据篇
- ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证
- 在ASP.NET MVC Framework中使用IErrorDataInfo接口实现验证(翻的)
- ASP.NET MVC 计划任务(不使用外接程序,.net内部机制实现)
- 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之用户管理(4)
- 在ASP.NET MVC Web API中使用Apworks开发第一个HTTP服务
- [翻译]ASP.NET MVC 3 开发的20个秘诀(十四)[20 Recipes for Programming MVC 3]:使用Ajax提交Form