在上一篇<学习MVC之租房网站(三)-编写Eneity类并创建数据库>中,记录了编写Eneity类并采用CodeFirst的方式创建数据库的过程,接下来就到了Service层的实现了,并且在开始后续工作前,首先进行充分的单元测试。
长久以来,一直为写出很多bug而苦恼,这儿用过单元测试后,惊喜地发现,这不正是保证代码质量的好方法嘛,虽然会耗费额外的时间,但决定以后要把单元测试运用到工作和学习的实践中。
一、实现Service层
1. 为了减少模块、层之间的耦合,在Service层上面增加了IService接口层,一张表对应一个Service类,并对应实现一组IService接口的方法。比如关于后台管理员表T_AdminUser的对应关系为:
T_AdminUser表->AdminUserService->IAdminUserService
IAdminUserService接口中定义的方法有:
然后在AdminUserService类中会一一实现这些方法
2. 配置AutoFac
Service类都在ZSZ.Service项目中,这些Service类都对应实现了ZSZ.IService中的接口。然后会配置使用IOC容器AutoFac,在Global.asax中添加代码:
关于IOC以及AutoFac非常不理解,先用起来,慢慢了解吧,大概的作用就是配置了ZSZ.Service为要使用的Service程序集后,在Controller中直接调用IService就可以了,这样Controller与Service层就解耦了,解耦当然是好事情。
为了有选择性地让AutoFac管理Service,利用一个空的接口IServiceSupport做标识,只有继承了IServiceSupport接口的才会被注入。但对于这儿的IsAssignableFrom需要学学,顺便可以给公众号凑个数,嘿~
二、单元测试
Service都实现后,开始单元测试,VS自带了单元测试的项目模板,并在命名空间Microsoft.VisualStudio.TestTools.UnitTesting下提供了一系列标签,比如[TestClass]、[TestMethod]等,我只用过了这两个。需要对单元测试进行系统的学习,但在最近的实践中,发现了至少是适合自己的单元测试写法,即一个被测试类对应一个单元测试类,一个方法会有多个测试案例,这些Case各编写一个方法,这样便于在VS给出测试结果后快速定位到错误的代码。但每个Case一个方法会造成方法太多,于是用#region包裹一个被测方法相关的所有Case对应的方法。
如对于AdminUserService. GetAll(long? cityId)的测试,想到有如下三个测试案例:
最后,有一种特殊的Assert,Assert.ThrowsException,用于检查是否返回指定的异常类型,写法为:
Assert.ThrowsException<ArgumentException>(() => atService.GetAttachments(2));
注:
课程内容来自如鹏网(www.rupeng.com),专注于大学生就业的在线教育平台;
ASP.NET MVC课程 http://www.rupeng.com/News/9/640.shtml