经过近一个多月的努力,我使用自己的业余时间在V2的基础上对Byteart Retail案例重新打造,使得V3以一种全新的面貌出现在关注.NET企业级架构和领域驱动设计的读者朋友面前。与前两个版本相比,V3无论在界面上,还是在业务方面,甚至是技术方面都有了很大的进步。虽然系统完善了不少,但毕竟我没办法将全部时间精力都投入在这一开源项目上,所以V3肯定还存在不少缺陷,因此希望朋友们能够谅解,如果遇到问题,可以自己试着研究并动手解决,我想这样会对自己有很大的帮助。如果实在无法解决,或者有好的想法和建议,也欢迎在此留言与我联系。对Byteart Retail不太了解的朋友,可以点击下面的链接以了解前两个版本的详细信息,一些相关的设计思路和架构视图,我就不在此重复了。
EntityFramework之领域驱动设计实践【基于EF 4.3.1 设计实践】
EntityFramework之领域驱动设计实践【Byteart Retail V2】
案例源代码下载
请【单击此处】下载本案例的所有源代码和Visual Studio 2012解决方案文件(zip压缩包)。很多朋友建议我将本案例转移到类似codeplex或者GitHub的repository中,由于时间关系,暂时还没能将其转移到这些网站中,因此V3仍然以zip包下载的方式提供给大家,还望海涵。我争取在后续的开发过程中,将其加入codeplex或者GitHub中。
运行案例程序
先决条件
从V3开始,本案例使用Visual Studio 2012开发,因此,要编译本案例的源代码程序,则需要首先安装Visual Studio 2012。由于数据库采用了SQL Server Express LocalDB,因此,这部分组件也需要正确安装(如果是选择完整安装Visual Studio 2012,则可以忽略LocalDB的安装)。此外,无需安装其它组件。
编译运行
将下载的ByteartRetail_V3.zip文件解压到一个本地的磁盘目录下,然后在Microsoft Visual Studio 2012中打开ByteartRetail.sln文件,再将ByteartRetail.Web项目设置为启动项目后,直接按F5(或者Debug –> Start Debugging菜单项)运行本案例即可。注意:
- 如果不打算以Debug的方式启动本案例,那就需要首先展开ByteartRetail.Services项目,任选其中一个.svc的服务文件(比如UserService.svc)然后点击右键选择View In Browser菜单项,以便启动服务端的ASP.NET Development Server;最后再直接启动ByteartRetail.Web项目
-
由于Byteart Retail V3的数据库采用的是SQL Server 2012 Express LocalDB(默认实例),在程序连接LocalDB数据库时,LocalDB需要创建/初始化数据库实例,因此在首次启动时有可能会出现数据库连接超时的异常,如果碰到这类问题,则请稍等片刻然后再重试。MSDN上有关于这个问题的描述:
The first time a user on a computer tries to connect to LocalDB, the automatic instance must be both created and started. The extra time for the instance to be created can cause the connection attempt to fail with a timeout message. When this happens, wait a few seconds to let the creation process complete, and then connect again.
- 如果以上述第一点的方式运行ByteartRetail.Web项目并出现与WCF绑定相关的错误时,这表示WCF服务并没有完全启动,请重新启动ByteartRetail.Services项目,然后再启动ByteartRetail.Web项目
登录账户
启动成功后,就可以单击页面右上角的“登录”链接进行账户登录。默认的登录账户有(用户名/密码):
- admin/admin:以管理员角色登录,可以对站点进行管理
- sales/sales:以销售人员角色登录,可以查看系统中订单信息并进行发货等操作
- buyer/buyer:以采购人员角色登录,可以管理商品分类和商品信息
- daxnet/daxnet:普通用户角色,不能对系统进行任何管理操作
解决方案结构
ByteartRetail.sln包含以下项目:
- ByteartRetail.Design:包含一些设计相关的图画文件,仅供参考,没有实际意义
- ByteartRetail.Application:应用层
- ByteartRetail.DataObjects:数据传输对象及其类型扩展
- ByteartRetail.Domain:领域层
- ByteartRetail.Domain.Repositories:仓储的具体实现(目前是基于Entity Framework 5.0的实现)
- ByteartRetail.Infrastructure:基础结构层
- ByteartRetail.Infrastructure.Caching:位于基础结构层的缓存实现
- ByteartRetail.ServiceContracts:基于WCF的服务契约
- ByteartRetail.Services:WCF服务
- ByteartRetail.Web:基于ASP.NET MVC的站点程序(表示层)
以下是各项目之间的依赖关系:
改进的内容
与之前的版本相比,V3更多的是在业务方面有了新的功能,同时在技术方面也有一些改进。
业务方面
- 添加了商品分类功能,丰富了原有的商品种类划分
- 添加了用户角色功能
- 添加了商品信息的维护功能
- 添加了“特色商品”的功能
- 完善了订单状态
- 优化了界面效果,提高了用户体验(菜单、分页等)
技术方面
- 使用ChannelFactory实现WCF的调用,替代了原有的直接使用Service Reference的方式,为后续的WCF认证和授权做准备
- 在配置文件中加入了与Byteart Retail相关的配置节点,这包括:分页设置以及角色的映射信息等
- 通过AOP拦截的方式引入缓存机制,使用Patterns & Practices Enterprise Library Caching Application Block为WCF服务提供数据缓存机制。在今后的版本更新中将引入Appfabric Cache作为缓存供应者
- 更新了仓储(repository)的接口定义,实现了基于Entity Framework的分页功能
- 演示了Entity Framework 5.0对枚举(enum)类型的支持
总结
时间关系,暂时先介绍这么些内容,有关技术方面的细节,我打算以系列文章的方式详细介绍,争取能够涉及到Byteart Retail项目的各个角落。Byteart Retail案例将会继续发展下去,无论在业务方面还是在技术层面,都将会有新的内容加入。我也会根据大家的建议,更早地将其发布到codeplex上,以便大家能够随时跟踪本案例项目的状态。
其实平时做这些工作的时候,也会要顶着不小的压力,一方面有时候工作上的事情会很多,当然需要把手头工作放在首位;另一方面来自生活的压力,也有周围的人会觉得我做这些事情也是毫无收益,又是何苦。在此也谈谈自己的感受吧。虽然国内技术牛人很多,比我技术做的好的也不少,但我们的软件技术水平跟国际上的一些国家之间还是有一定的差距,当然,“环境因素”暂且放一边,“国内水平”、“国际水平”的分析也先放一放。我们就说说自己能做的事情,我也不指望自己能够给目前的这些“现状”带来多大的改变,因为自知实力有限,但我觉得我能够一些事情,或者说能够给他人带来一些影响。就拿现在在社区博客中做的事情来说,或许我做的这些能够影响到他人,比如让一些朋友少走弯路,或者帮另一些朋友理清了解决问题的思路,我想这就是很好的。你存在于世界上,你对其产生了影响,也算是一种成就。事实上一生中能做的事情是有限的,能做好的更是少之又少,关键是贵在坚持吧。最后也感谢一下那些支持我的朋友们。