时隔一年,继续咱们的Apworks框架之旅。在接下来的文章中,我将逐渐向你们介绍如何在Visual Studio中结合Apworks框架,使用ASP.NET Web API和MVC来开发面向经典分层架构的应用程序。在这一讲中,咱们首先了解一下分层架构的各个“层”,以及所涉及的Visual Studio项目,而后,咱们从领域模型开始,在Visual Studio中开始咱们的应用程序开发之旅。html
说明:虽然如今微软已经发布了Visual Studio 2015,但为了照顾广大的老版本用户,本文及后续文章都会以Visual Studio 2013 with Update 4做为开发工具进行介绍。此外,在某些场景中,会须要用到Visual Studio 2013 Ultimate的部分功能,因此,若是您所使用的Visual Studio不是Ultimate版本的话,您将没法动手实践某些案例,但您仍然能够经过阅读文章来获取所须要的知识。git
已经有一段时间没有向你们介绍Apworks框架的相关内容了,在最近的半年中,我对Apworks作了一些小的重构,具体内容以下:github
您能够直接点击 https://github.com/daxnet/Apworks 进入Apworks框架的开源主页,也可使用如下命令获取Apworks的源代码:数据库
git clone https://github.com/daxnet/Apworks.git
我又一次试图从一个应用案例开始向你们介绍整个事情的前因后果,但愿可以让你们看清楚并了解到问题的本质。我记得以前也有不少文章我也是举了很多例子,有的文章把例子讲解完了,有的又是半途而废,有始无终。好吧,无论怎么样,没有案例就没法一步步地将问题解释清楚。毕竟理论也是须要跟实践相结合的。安全
这个案例是一个我的便签应用。刚开始的时候,我把这个小标题称为《案例:一个简单的我的便签应用》,思索以后将“一个简单的”五个字去掉,我想,简单的东西不是你们想要的,简单的东西你们都会作,听起来彷佛甚至不须要任何框架和工具的辅助,就能简简单单地把问题解决掉。我想向你们介绍的是一个完整的企业级应用,它不只应该实现基本的领域逻辑,更应该包含诸如安全、性能等各个方面的内容,因此,综合起来,这事情就简单不了。性能优化
认识个人圈内朋友应该都知道我本身开发了一个基于云的我的笔记系统Cloud Notes,也有一些文章介绍Cloud Notes的技术和开发过程。不错,如今我打算使用的这个案例,它的业务背景跟我的笔记系统很像,但为了介绍技术部分,我会让其业务变得更为简单,也会介绍一些实现RESTful服务的最佳实践,所以,该案例会在技术架构层面与Cloud Notes相似,但也会有些细节上的差别。总而言之,尽可能以简洁的形式来讲明问题。架构
本案例涉及的部分包括用户和权限,从业务上看,每一个用户能够管理本身的便签,内容就这么多。太复杂了会让人以为头晕目眩,也会下降本文的可读性。OK,让咱们给这个案例起个名字,就叫EasyMemo吧。框架
在我之前的博客中,少不了对分层架构的介绍,尤为是在介绍领域驱动设计的时候,还介绍了与之异构的基于事件的命令查询职责分离(CQRS)架构。本案例采用经典分层架构进行开发。在此,我以为仍是有必要把架构图再简单画一下,而且标注咱们将要使用的微软技术。这样作一方面可让你们了解到咱们使用了哪些技术,另外一方面,在后续的介绍中,也可让你们看到,咱们目前是在讨论整个架构的哪一个部分。请参见下图:异步
能够看到,在整个案例的介绍过程当中,咱们将会使用Entity Framework 6做为数据存储ORM,后台数据库选用Microsoft SQL Server,领域模型层适配Apworks框架,应用层任务协调使用Apworks框架,而经过ASP.NET Web API 2向外界提供RESTful服务。表现层采用ASP.NET MVC 4加上AngularJS实现,固然会用到Twitter Bootstrap的一些特性,毕竟在标准的ASP.NET MVC模板中,默认安装了Bootstrap的包。工具
基本架构就这样,接下来,让咱们一块儿动手开始在Visual Studio 2013中搭建咱们的EasyMemo项目吧。
打开Visual Studio 2013,固然,目前咱们还不须要使用Ultimate版本,由于解决方案的搭建过程不会涉及任何与Visual Studio 2013 Ultimate相关的特性。为了能让解决方案中各项目的组织更为合理,建议首先在Visual Studio 2013中新建一个空白的解决方案,.NET Framework版本请选择4.5.1,由于从此要用的Apworks框架是基于4.5.1的:
单击“肯定”按钮后,Visual Studio就会在【解决方案资源管理器】中显示一个空白的解决方案。接下来,咱们就相继往该解决方案中建立如下新项目:
建立完成后,EasyMemo的解决方案中应该包含以下5个项目,每一个项目中都只包含了Visual Studio项目模板自带的默认类型:
为了可以在编译整个解决方案的时候,让Visual Studio自动下载每一个项目所依赖的NuGet包,强烈建议在EasyMemo解决方案上单击鼠标右键,选择【启用NuGet程序包还原】选项:
如今,咱们就从领域模型的设计开始,一步步地完成整个应用程序的开发。
首先,在EasyMemo.Domain项目上,单击鼠标右键,选择【管理NuGet程序包】,在弹出的对话框的【搜索联机】文本框中,输入关键字【Apworks】,而后在程序包列表中选择【Apworks】并单击【安装】按钮:
在安装时会提示许可协议对话框,单击【我接受】按钮便可。
而后,在EasyMemo.Domain上再新增一个AggregateRoot抽象类,使其实现Apworks中的IAggregateRoot接口:
using System; using Apworks; public abstract class AggregateRoot : IAggregateRoot { public Guid ID { get; set; } }
再新建一个Account类,使其继承AggregateRoot类,它表示在EasyMemo整个应用程序中的“用户帐户”的概念,为了从此的实现更为方便快捷,Account类仅提供如下属性:
/// <summary> /// 表示EasyMemo中“用户帐户”的概念 /// </summary> public class Account : AggregateRoot { /// <summary> /// 获取或设置帐户名。 /// </summary> public string Name { get; set; } /// <summary> /// 获取或设置帐户密码。 /// </summary> public string Password { get; set; } /// <summary> /// 获取或设置邮箱地址。 /// </summary> public string Email { get; set; } /// <summary> /// 获取或设置显示名称。 /// </summary> public string DisplayName { get; set; } /// <summary> /// 获取或设置帐户建立日期。 /// </summary> public DateTime DateCreated { get; set; } /// <summary> /// 获取或设置最近一次登陆日期。 /// </summary> public DateTime? DateLastLogon { get; set; } }
编译EasyMemo.Domain,编译经过,表示咱们已经正常安装并引用Apworks程序包了,能够继续对领域模型进行设计了。在下一讲中,我将介绍EasyMemo领域模型的设计。